1 /*!
2  * jQuery JavaScript Library v1.
10.2
3  * http://jquery.com/
4  *
5  * Includes Sizzle.js
6  * http://sizzlejs.com/
7  *
8  * Copyright
2005, 2013 jQuery Foundation, Inc. and other contributors
9  * Released under the MIT license
10  * http://jquery.org/license
11  *
12  * Date:
2013-07-03T13:48Z
13  */

14 (function( window, undefined ) {

15
16 // Can
't do this because several apps including ASP.NET trace
17 // the stack via arguments.caller.callee and Firefox dies
if
18 // you
try to trace through "use strict" call chains. (#13335)
19 // Support: Firefox
18+
20 //
"use strict";
21 var

22     
// The deferred used on DOM ready
23     readyList,
24
25     
// A central reference to the root jQuery(document)
26     rootjQuery,
27
28     
// Support: IE<10
29     
// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
30     core_strundefined =
typeof undefined,
31
32     
// Use the correct document accordingly with window argument (sandbox)
33     location = window.location,
34     document = window.document,
35     docElem = document.documentElement,
36
37     
// Map over jQuery in case of overwrite
38     _jQuery = window.jQuery,
39
40     
// Map over the $ in case of overwrite
41     _$ = window.$,
42
43     
// [[Class]] -> type pairs
44     class2type = {},
45
46     
// List of deleted data cache ids, so we can reuse them
47     core_deletedIds = [],
48
49     core_version =
"1.10.2",
50
51     
// Save a reference to some core methods
52     core_concat = core_deletedIds.concat,
53     core_push = core_deletedIds.push,
54     core_slice = core_deletedIds.slice,
55     core_indexOf = core_deletedIds.indexOf,
56     core_toString = class2type.toString,
57     core_hasOwn = class2type.hasOwnProperty,
58     core_trim = core_version.trim,
59
60     
// Define a local copy of jQuery
61     jQuery = function( selector, context ) {
62         
// The jQuery object is actually just the init constructor 'enhanced'
63         
return new jQuery.fn.init( selector, context, rootjQuery );
64     },
65
66     
// Used for matching numbers
67     core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
68
69     
// Used for splitting on whitespace
70     core_rnotwhite = /\S+/g,
71
72     
// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
73     rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
74
75     
// A simple way to check for HTML strings
76     
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
77     
// Strict HTML recognition (#11290: must start with <)
78     rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
79
80     
// Match a standalone tag
81     rsingleTag = /^<(\w+)\s*\/?>(?:<\/\
1>|)$/,
82
83     
// JSON RegExp
84     rvalidchars = /^[\],:{}\s]*$/,
85     rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
86     rvalidescape = /\\(?:[
"\\\/bfnrt]|u[\da-fA-F]{4})/g,
87     rvalidtokens = /"
[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
88
89     
// Matches dashed string for camelizing
90     rmsPrefix = /^-ms-/,
91     rdashAlpha = /-([\da-z])/gi,
92
93     
// Used by jQuery.camelCase as callback to replace()
94     fcamelCase = function( all, letter ) {
95         
return letter.toUpperCase();
96     },
97
98     
// The ready event handler
99     completed = function(
event ) {
100
101         
// readyState === "complete" is good enough for us to call the dom ready in oldIE
102         
if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
103             detach();
104             jQuery.ready();
105         }
106     },
107     
// Clean-up method for dom ready events
108     detach = function() {
109         
if ( document.addEventListener ) {
110             document.removeEventListener(
"DOMContentLoaded", completed, false );
111             window.removeEventListener(
"load", completed, false );
112
113         }
else {
114             document.detachEvent(
"onreadystatechange", completed );
115             window.detachEvent(
"onload", completed );
116         }
117     };
118
119 jQuery.fn = jQuery.prototype = {
120     
// The current version of jQuery being used
121     jquery: core_version,
122
123     constructor: jQuery,
124     init: function( selector, context, rootjQuery ) {
125         
var match, elem;
126
127         
// HANDLE: $(""), $(null), $(undefined), $(false)
128         
if ( !selector ) {
129             
return this;
130         }
131
132         
// Handle HTML strings
133         
if ( typeof selector === "string" ) {
134             
if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
135                 
// Assume that strings that start and end with <> are HTML and skip the regex check
136                 match = [
null, selector, null ];
137
138             }
else {
139                 match = rquickExpr.exec( selector );
140             }
141
142             
// Match html or make sure no context is specified for #id
143             
if ( match && (match[1] || !context) ) {
144
145                 
// HANDLE: $(html) -> $(array)
146                 
if ( match[1] ) {
147                     context = context instanceof jQuery ? context[
0] : context;
148
149                     
// scripts is true for back-compat
150                     jQuery.merge(
this, jQuery.parseHTML(
151                         match[
1],
152                         context && context.nodeType ? context.ownerDocument || context : document,
153                         
true
154                     ) );
155
156                     
// HANDLE: $(html, props)
157                     
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
158                         
for ( match in context ) {
159                             
// Properties of context are called as methods if possible
160                             
if ( jQuery.isFunction( this[ match ] ) ) {
161                                 
this[ match ]( context[ match ] );
162
163                             
// ...and otherwise set as attributes
164                             }
else {
165                                 
this.attr( match, context[ match ] );
166                             }
167                         }
168                     }
169
170                     
return this;
171
172                 
// HANDLE: $(#id)
173                 }
else {
174                     elem = document.getElementById( match[
2] );
175
176                     
// Check parentNode to catch when Blackberry 4.6 returns
177                     
// nodes that are no longer in the document #6963
178                     
if ( elem && elem.parentNode ) {
179                         
// Handle the case where IE and Opera return items
180                         
// by name instead of ID
181                         
if ( elem.id !== match[2] ) {
182                             
return rootjQuery.find( selector );
183                         }
184
185                         
// Otherwise, we inject the element directly into the jQuery object
186                         
this.length = 1;
187                         
this[0] = elem;
188                     }
189
190                     
this.context = document;
191                     
this.selector = selector;
192                     
return this;
193                 }
194
195             
// HANDLE: $(expr, $(...))
196             }
else if ( !context || context.jquery ) {
197                 
return ( context || rootjQuery ).find( selector );
198
199             
// HANDLE: $(expr, context)
200             
// (which is just equivalent to: $(context).find(expr)
201             }
else {
202                 
return this.constructor( context ).find( selector );
203             }
204
205         
// HANDLE: $(DOMElement)
206         }
else if ( selector.nodeType ) {
207             
this.context = this[0] = selector;
208             
this.length = 1;
209             
return this;
210
211         
// HANDLE: $(function)
212         
// Shortcut for document ready
213         }
else if ( jQuery.isFunction( selector ) ) {
214             
return rootjQuery.ready( selector );
215         }
216
217         
if ( selector.selector !== undefined ) {
218             
this.selector = selector.selector;
219             
this.context = selector.context;
220         }
221
222         
return jQuery.makeArray( selector, this );
223     },
224
225     
// Start with an empty selector
226     selector:
"",
227
228     
// The default length of a jQuery object is 0
229     length:
0,
230
231     toArray: function() {
232         
return core_slice.call( this );
233     },
234
235     
// Get the Nth element in the matched element set OR
236     
// Get the whole matched element set as a clean array
237     
get: function( num ) {
238         
return num == null ?
239
240             
// Return a 'clean' array
241             
this.toArray() :
242
243             
// Return just the object
244             ( num <
0 ? this[ this.length + num ] : this[ num ] );
245     },
246
247     
// Take an array of elements and push it onto the stack
248     
// (returning the new matched element set)
249     pushStack: function( elems ) {
250
251         
// Build a new jQuery matched element set
252         
var ret = jQuery.merge( this.constructor(), elems );
253
254         
// Add the old object onto the stack (as a reference)
255         ret.prevObject =
this;
256         ret.context =
this.context;
257
258         
// Return the newly-formed element set
259         
return ret;
260     },
261
262     
// Execute a callback for every element in the matched set.
263     
// (You can seed the arguments with an array of args, but this is
264     
// only used internally.)
265     each: function( callback, args ) {
266         
return jQuery.each( this, callback, args );
267     },
268
269     ready: function( fn ) {
270         
// Add the callback
271         jQuery.ready.promise().done( fn );
272
273         
return this;
274     },
275
276     slice: function() {
277         
return this.pushStack( core_slice.apply( this, arguments ) );
278     },
279
280     first: function() {
281         
return this.eq( 0 );
282     },
283
284     last: function() {
285         
return this.eq( -1 );
286     },
287
288     eq: function( i ) {
289         
var len = this.length,
290             j = +i + ( i <
0 ? len : 0 );
291         
return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
292     },
293
294     map: function( callback ) {
295         
return this.pushStack( jQuery.map(this, function( elem, i ) {
296             
return callback.call( elem, i, elem );
297         }));
298     },
299
300     end: function() {
301         
return this.prevObject || this.constructor(null);
302     },
303
304     
// For internal use only.
305     
// Behaves like an Array's method, not like a jQuery method.
306     push: core_push,
307     sort: [].sort,
308     splice: [].splice
309 };

310
311 // Give the init function the jQuery prototype
for later instantiation
312 jQuery.fn.init.prototype = jQuery.fn;
313
314 jQuery.extend = jQuery.fn.extend = function() {
315     
var src, copyIsArray, copy, name, options, clone,
316         target = arguments[
0] || {},
317         i =
1,
318         length = arguments.length,
319         deep =
false;
320
321     
// Handle a deep copy situation
322     
if ( typeof target === "boolean" ) {
323         deep = target;
324         target = arguments[
1] || {};
325         
// skip the boolean and the target
326         i =
2;
327     }
328
329     
// Handle case when target is a string or something (possible in deep copy)
330     
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
331         target = {};
332     }
333
334     
// extend jQuery itself if only one argument is passed
335     
if ( length === i ) {
336         target =
this;
337         --i;
338     }
339
340     
for ( ; i < length; i++ ) {
341         
// Only deal with non-null/undefined values
342         
if ( (options = arguments[ i ]) != null ) {
343             
// Extend the base object
344             
for ( name in options ) {
345                 src = target[ name ];
346                 copy = options[ name ];
347
348                 
// Prevent never-ending loop
349                 
if ( target === copy ) {
350                     
continue;
351                 }
352
353                 
// Recurse if we're merging plain objects or arrays
354                 
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
355                     
if ( copyIsArray ) {
356                         copyIsArray =
false;
357                         clone = src && jQuery.isArray(src) ? src : [];
358
359                     }
else {
360                         clone = src && jQuery.isPlainObject(src) ? src : {};
361                     }
362
363                     
// Never move original objects, clone them
364                     target[ name ] = jQuery.extend( deep, clone, copy );
365
366                 
// Don't bring in undefined values
367                 }
else if ( copy !== undefined ) {
368                     target[ name ] = copy;
369                 }
370             }
371         }
372     }
373
374     
// Return the modified object
375     
return target;
376 };
377
378 jQuery.extend({
379     
// Unique for each copy of jQuery on the page
380     
// Non-digits removed to match rinlinejQuery
381     expando:
"jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
382
383     noConflict: function( deep ) {
384         
if ( window.$ === jQuery ) {
385             window.$ = _$;
386         }
387
388         
if ( deep && window.jQuery === jQuery ) {
389             window.jQuery = _jQuery;
390         }
391
392         
return jQuery;
393     },
394
395     
// Is the DOM ready to be used? Set to true once it occurs.
396     isReady:
false,
397
398     
// A counter to track how many items to wait for before
399     
// the ready event fires. See #6781
400     readyWait:
1,
401
402     
// Hold (or release) the ready event
403     holdReady: function( hold ) {
404         
if ( hold ) {
405             jQuery.readyWait++;
406         }
else {
407             jQuery.ready(
true );
408         }
409     },
410
411     
// Handle when the DOM is ready
412     ready: function( wait ) {
413
414         
// Abort if there are pending holds or we're already ready
415         
if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
416             
return;
417         }
418
419         
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
420         
if ( !document.body ) {
421             
return setTimeout( jQuery.ready );
422         }
423
424         
// Remember that the DOM is ready
425         jQuery.isReady =
true;
426
427         
// If a normal DOM Ready event fired, decrement, and wait if need be
428         
if ( wait !== true && --jQuery.readyWait > 0 ) {
429             
return;
430         }
431
432         
// If there are functions bound, to execute
433         readyList.resolveWith( document, [ jQuery ] );
434
435         
// Trigger any bound ready events
436         
if ( jQuery.fn.trigger ) {
437             jQuery( document ).trigger(
"ready").off("ready");
438         }
439     },
440
441     
// See test/unit/core.js for details concerning isFunction.
442     
// Since version 1.3, DOM methods and functions like alert
443     
// aren't supported. They return false on IE (#2968).
444     isFunction: function( obj ) {
445         
return jQuery.type(obj) === "function";
446     },
447
448     isArray: Array.isArray || function( obj ) {
449         
return jQuery.type(obj) === "array";
450     },
451
452     isWindow: function( obj ) {
453         
/* jshint eqeqeq: false */
454         
return obj != null && obj == obj.window;
455     },
456
457     isNumeric: function( obj ) {
458         
return !isNaN( parseFloat(obj) ) && isFinite( obj );
459     },
460
461     type: function( obj ) {
462         
if ( obj == null ) {
463             
return String( obj );
464         }
465         
return typeof obj === "object" || typeof obj === "function" ?
466             class2type[ core_toString.call(obj) ] ||
"object" :
467             
typeof obj;
468     },
469
470     isPlainObject: function( obj ) {
471         
var key;
472
473         
// Must be an Object.
474         
// Because of IE, we also have to check the presence of the constructor property.
475         
// Make sure that DOM nodes and window objects don't pass through, as well
476         
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
477             
return false;
478         }
479
480         
try {
481             
// Not own constructor property must be Object
482             
if ( obj.constructor &&
483                 !core_hasOwn.call(obj,
"constructor") &&
484                 !core_hasOwn.call(obj.constructor.prototype,
"isPrototypeOf") ) {
485                 
return false;
486             }
487         }
catch ( e ) {
488             
// IE8,9 Will throw exceptions on certain host objects #9897
489             
return false;
490         }
491
492         
// Support: IE<9
493         
// Handle iteration over inherited properties before own properties.
494         
if ( jQuery.support.ownLast ) {
495             
for ( key in obj ) {
496                 
return core_hasOwn.call( obj, key );
497             }
498         }
499
500         
// Own properties are enumerated firstly, so to speed up,
501         
// if last one is own, then all properties are own.
502         
for ( key in obj ) {}
503
504         
return key === undefined || core_hasOwn.call( obj, key );
505     },
506
507     isEmptyObject: function( obj ) {
508         
var name;
509         
for ( name in obj ) {
510             
return false;
511         }
512         
return true;
513     },
514
515     error: function( msg ) {
516         
throw new Error( msg );
517     },
518
519     
// data: string of html
520     
// context (optional): If specified, the fragment will be created in this context, defaults to document
521     
// keepScripts (optional): If true, will include scripts passed in the html string
522     parseHTML: function( data, context, keepScripts ) {
523         
if ( !data || typeof data !== "string" ) {
524             
return null;
525         }
526         
if ( typeof context === "boolean" ) {
527             keepScripts = context;
528             context =
false;
529         }
530         context = context || document;
531
532         
var parsed = rsingleTag.exec( data ),
533             scripts = !keepScripts && [];
534
535         
// Single tag
536         
if ( parsed ) {
537             
return [ context.createElement( parsed[1] ) ];
538         }
539
540         parsed = jQuery.buildFragment( [ data ], context, scripts );
541         
if ( scripts ) {
542             jQuery( scripts ).
remove();
543         }
544         
return jQuery.merge( [], parsed.childNodes );
545     },
546
547     parseJSON: function( data ) {
548         
// Attempt to parse using the native JSON parser first
549         
if ( window.JSON && window.JSON.parse ) {
550             
return window.JSON.parse( data );
551         }
552
553         
if ( data === null ) {
554             
return data;
555         }
556
557         
if ( typeof data === "string" ) {
558
559             
// Make sure leading/trailing whitespace is removed (IE can't handle it)
560             data = jQuery.trim( data );
561
562             
if ( data ) {
563                 
// Make sure the incoming data is actual JSON
564                 
// Logic borrowed from http://json.org/json2.js
565                 
if ( rvalidchars.test( data.replace( rvalidescape, "@" )
566                     .replace( rvalidtokens,
"]" )
567                     .replace( rvalidbraces,
"")) ) {
568
569                     
return ( new Function( "return " + data ) )();
570                 }
571             }
572         }
573
574         jQuery.error(
"Invalid JSON: " + data );
575     },
576
577     
// Cross-browser xml parsing
578     parseXML: function( data ) {
579         
var xml, tmp;
580         
if ( !data || typeof data !== "string" ) {
581             
return null;
582         }
583         
try {
584             
if ( window.DOMParser ) { // Standard
585                 tmp =
new DOMParser();
586                 xml = tmp.parseFromString( data ,
"text/xml" );
587             }
else { // IE
588                 xml =
new ActiveXObject( "Microsoft.XMLDOM" );
589                 xml.
async = "false";
590                 xml.loadXML( data );
591             }
592         }
catch( e ) {
593             xml = undefined;
594         }
595         
if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
596             jQuery.error(
"Invalid XML: " + data );
597         }
598         
return xml;
599     },
600
601     noop: function() {},
602
603     
// Evaluates a script in a global context
604     
// Workarounds based on findings by Jim Driscoll
605     
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
606     globalEval: function( data ) {
607         
if ( data && jQuery.trim( data ) ) {
608             
// We use execScript on Internet Explorer
609             
// We use an anonymous function so that context is window
610             
// rather than jQuery in Firefox
611             ( window.execScript || function( data ) {
612                 window[
"eval" ].call( window, data );
613             } )( data );
614         }
615     },
616
617     
// Convert dashed to camelCase; used by the css and data modules
618     
// Microsoft forgot to hump their vendor prefix (#9572)
619     camelCase: function(
string ) {
620         
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
621     },
622
623     nodeName: function( elem, name ) {
624         
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
625     },
626
627     
// args is for internal usage only
628     each: function( obj, callback, args ) {
629         
var value,
630             i =
0,
631             length = obj.length,
632             isArray = isArraylike( obj );
633
634         
if ( args ) {
635             
if ( isArray ) {
636                 
for ( ; i < length; i++ ) {
637                     
value = callback.apply( obj[ i ], args );
638
639                     
if ( value === false ) {
640                         
break;
641                     }
642                 }
643             }
else {
644                 
for ( i in obj ) {
645                     
value = callback.apply( obj[ i ], args );
646
647                     
if ( value === false ) {
648                         
break;
649                     }
650                 }
651             }
652
653         
// A special, fast, case for the most common use of each
654         }
else {
655             
if ( isArray ) {
656                 
for ( ; i < length; i++ ) {
657                     
value = callback.call( obj[ i ], i, obj[ i ] );
658
659                     
if ( value === false ) {
660                         
break;
661                     }
662                 }
663             }
else {
664                 
for ( i in obj ) {
665                     
value = callback.call( obj[ i ], i, obj[ i ] );
666
667                     
if ( value === false ) {
668                         
break;
669                     }
670                 }
671             }
672         }
673
674         
return obj;
675     },
676
677     
// Use native String.trim function wherever possible
678     trim: core_trim && !core_trim.call(
"\uFEFF\xA0") ?
679         function( text ) {
680             
return text == null ?
681                 
"" :
682                 core_trim.call( text );
683         } :
684
685         
// Otherwise use our own trimming functionality
686         function( text ) {
687             
return text == null ?
688                 
"" :
689                 ( text +
"" ).replace( rtrim, "" );
690         },
691
692     
// results is for internal usage only
693     makeArray: function( arr, results ) {
694         
var ret = results || [];
695
696         
if ( arr != null ) {
697             
if ( isArraylike( Object(arr) ) ) {
698                 jQuery.merge( ret,
699                     
typeof arr === "string" ?
700                     [ arr ] : arr
701                 );
702             }
else {
703                 core_push.call( ret, arr );
704             }
705         }
706
707         
return ret;
708     },
709
710     inArray: function( elem, arr, i ) {
711         
var len;
712
713         
if ( arr ) {
714             
if ( core_indexOf ) {
715                 
return core_indexOf.call( arr, elem, i );
716             }
717
718             len = arr.length;
719             i = i ? i <
0 ? Math.max( 0, len + i ) : i : 0;
720
721             
for ( ; i < len; i++ ) {
722                 
// Skip accessing in sparse arrays
723                 
if ( i in arr && arr[ i ] === elem ) {
724                     
return i;
725                 }
726             }
727         }
728
729         
return -1;
730     },
731
732     merge: function( first, second ) {
733         
var l = second.length,
734             i = first.length,
735             j =
0;
736
737         
if ( typeof l === "number" ) {
738             
for ( ; j < l; j++ ) {
739                 first[ i++ ] = second[ j ];
740             }
741         }
else {
742             
while ( second[j] !== undefined ) {
743                 first[ i++ ] = second[ j++ ];
744             }
745         }
746
747         first.length = i;
748
749         
return first;
750     },
751
752     grep: function( elems, callback, inv ) {
753         
var retVal,
754             ret = [],
755             i =
0,
756             length = elems.length;
757         inv = !!inv;
758
759         
// Go through the array, only saving the items
760         
// that pass the validator function
761         
for ( ; i < length; i++ ) {
762             retVal = !!callback( elems[ i ], i );
763             
if ( inv !== retVal ) {
764                 ret.push( elems[ i ] );
765             }
766         }
767
768         
return ret;
769     },
770
771     
// arg is for internal usage only
772     map: function( elems, callback, arg ) {
773         
var value,
774             i =
0,
775             length = elems.length,
776             isArray = isArraylike( elems ),
777             ret = [];
778
779         
// Go through the array, translating each of the items to their
780         
if ( isArray ) {
781             
for ( ; i < length; i++ ) {
782                 
value = callback( elems[ i ], i, arg );
783
784                 
if ( value != null ) {
785                     ret[ ret.length ] =
value;
786                 }
787             }
788
789         
// Go through every key on the object,
790         }
else {
791             
for ( i in elems ) {
792                 
value = callback( elems[ i ], i, arg );
793
794                 
if ( value != null ) {
795                     ret[ ret.length ] =
value;
796                 }
797             }
798         }
799
800         
// Flatten any nested arrays
801         
return core_concat.apply( [], ret );
802     },
803
804     
// A global GUID counter for objects
805     guid:
1,
806
807     
// Bind a function to a context, optionally partially applying any
808     
// arguments.
809     proxy: function( fn, context ) {
810         
var args, proxy, tmp;
811
812         
if ( typeof context === "string" ) {
813             tmp = fn[ context ];
814             context = fn;
815             fn = tmp;
816         }
817
818         
// Quick check to determine if target is callable, in the spec
819         
// this throws a TypeError, but we will just return undefined.
820         
if ( !jQuery.isFunction( fn ) ) {
821             
return undefined;
822         }
823
824         
// Simulated bind
825         args = core_slice.call( arguments,
2 );
826         proxy = function() {
827             
return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
828         };
829
830         
// Set the guid of unique handler to the same of original handler, so it can be removed
831         proxy.guid = fn.guid = fn.guid || jQuery.guid++;
832
833         
return proxy;
834     },
835
836     
// Multifunctional method to get and set values of a collection
837     
// The value/s can optionally be executed if it's a function
838     access: function( elems, fn, key,
value, chainable, emptyGet, raw ) {
839         
var i = 0,
840             length = elems.length,
841             bulk = key ==
null;
842
843         
// Sets many values
844         
if ( jQuery.type( key ) === "object" ) {
845             chainable =
true;
846             
for ( i in key ) {
847                 jQuery.access( elems, fn, i, key[i],
true, emptyGet, raw );
848             }
849
850         
// Sets one value
851         }
else if ( value !== undefined ) {
852             chainable =
true;
853
854             
if ( !jQuery.isFunction( value ) ) {
855                 raw =
true;
856             }
857
858             
if ( bulk ) {
859                 
// Bulk operations run against the entire set
860                 
if ( raw ) {
861                     fn.call( elems,
value );
862                     fn =
null;
863
864                 
// ...except when executing function values
865                 }
else {
866                     bulk = fn;
867                     fn = function( elem, key,
value ) {
868                         
return bulk.call( jQuery( elem ), value );
869                     };
870                 }
871             }
872
873             
if ( fn ) {
874                 
for ( ; i < length; i++ ) {
875                     fn( elems[i], key, raw ?
value : value.call( elems[i], i, fn( elems[i], key ) ) );
876                 }
877             }
878         }
879
880         
return chainable ?
881             elems :
882
883             
// Gets
884             bulk ?
885                 fn.call( elems ) :
886                 length ? fn( elems[
0], key ) : emptyGet;
887     },
888
889     now: function() {
890         
return ( new Date() ).getTime();
891     },
892
893     
// A method for quickly swapping in/out CSS properties to get correct calculations.
894     
// Note: this method belongs to the css module but it's needed here for the support module.
895     
// If support gets modularized, this method should be moved back to the css module.
896     swap: function( elem, options, callback, args ) {
897         
var ret, name,
898             old = {};
899
900         
// Remember the old values, and insert the new ones
901         
for ( name in options ) {
902             old[ name ] = elem.style[ name ];
903             elem.style[ name ] = options[ name ];
904         }
905
906         ret = callback.apply( elem, args || [] );
907
908         
// Revert the old values
909         
for ( name in options ) {
910             elem.style[ name ] = old[ name ];
911         }
912
913         
return ret;
914     }
915 });
916
917 jQuery.ready.promise = function( obj ) {
918     
if ( !readyList ) {
919
920         readyList = jQuery.Deferred();
921
922         
// Catch cases where $(document).ready() is called after the browser event has already occurred.
923         
// we once tried to use readyState "interactive" here, but it caused issues like the one
924         
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
925         
if ( document.readyState === "complete" ) {
926             
// Handle it asynchronously to allow scripts the opportunity to delay ready
927             setTimeout( jQuery.ready );
928
929         
// Standards-based browsers support DOMContentLoaded
930         }
else if ( document.addEventListener ) {
931             
// Use the handy event callback
932             document.addEventListener(
"DOMContentLoaded", completed, false );
933
934             
// A fallback to window.onload, that will always work
935             window.addEventListener(
"load", completed, false );
936
937         
// If IE event model is used
938         }
else {
939             
// Ensure firing before onload, maybe late but safe also for iframes
940             document.attachEvent(
"onreadystatechange", completed );
941
942             
// A fallback to window.onload, that will always work
943             window.attachEvent(
"onload", completed );
944
945             
// If IE and not a frame
946             
// continually check to see if the document is ready
947             
var top = false;
948
949             
try {
950                 top = window.frameElement ==
null && document.documentElement;
951             }
catch(e) {}
952
953             
if ( top && top.doScroll ) {
954                 (function doScrollCheck() {
955                     
if ( !jQuery.isReady ) {
956
957                         
try {
958                             
// Use the trick by Diego Perini
959                             
// http://javascript.nwbox.com/IEContentLoaded/
960                             top.doScroll(
"left");
961                         }
catch(e) {
962                             
return setTimeout( doScrollCheck, 50 );
963                         }
964
965                         
// detach all dom ready events
966                         detach();
967
968                         
// and execute any waiting functions
969                         jQuery.ready();
970                     }
971                 })();
972             }
973         }
974     }
975     
return readyList.promise( obj );
976 };

977
978 // Populate the class2type map

979 jQuery.each(
"Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
980     class2type[
"[object " + name + "]" ] = name.toLowerCase();
981 });
982
983 function isArraylike( obj ) {
984     
var length = obj.length,
985         type = jQuery.type( obj );
986
987     
if ( jQuery.isWindow( obj ) ) {
988         
return false;
989     }
990
991     
if ( obj.nodeType === 1 && length ) {
992         
return true;
993     }
994
995     
return type === "array" || type !== "function" &&
996         ( length ===
0 ||
997         
typeof length === "number" && length > 0 && ( length - 1 ) in obj );
998 }

999
1000 // All jQuery objects should point back to these

1001 rootjQuery = jQuery(document);

1002 /*!
1003  * Sizzle CSS Selector Engine v1.
10.2
1004  * http://sizzlejs.com/
1005  *
1006  * Copyright
2013 jQuery Foundation, Inc. and other contributors
1007  * Released under the MIT license
1008  * http://jquery.org/license
1009  *
1010  * Date:
2013-07-03
1011  */

1012 (function( window, undefined ) {

1013
1014 var
i,
1015     support,
1016     cachedruns,
1017     Expr,
1018     getText,
1019     isXML,
1020     compile,
1021     outermostContext,
1022     sortInput,
1023
1024     
// Local document vars
1025     setDocument,
1026     document,
1027     docElem,
1028     documentIsHTML,
1029     rbuggyQSA,
1030     rbuggyMatches,
1031     matches,
1032     contains,
1033
1034     
// Instance-specific data
1035     expando =
"sizzle" + -(new Date()),
1036     preferredDoc = window.document,
1037     dirruns =
0,
1038     done =
0,
1039     classCache = createCache(),
1040     tokenCache = createCache(),
1041     compilerCache = createCache(),
1042     hasDuplicate =
false,
1043     sortOrder = function( a, b ) {
1044         
if ( a === b ) {
1045             hasDuplicate =
true;
1046             
return 0;
1047         }
1048         
return 0;
1049     },
1050
1051     
// General-purpose constants
1052     strundefined =
typeof undefined,
1053     MAX_NEGATIVE =
1 << 31,
1054
1055     
// Instance methods
1056     hasOwn = ({}).hasOwnProperty,
1057     arr = [],
1058     pop = arr.pop,
1059     push_native = arr.push,
1060     push = arr.push,
1061     slice = arr.slice,
1062     
// Use a stripped-down indexOf if we can't use a native one
1063     indexOf = arr.indexOf || function( elem ) {
1064         
var i = 0,
1065             len =
this.length;
1066         
for ( ; i < len; i++ ) {
1067             
if ( this[i] === elem ) {
1068                 
return i;
1069             }
1070         }
1071         
return -1;
1072     },
1073
1074     booleans =
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
1075
1076     
// Regular expressions
1077
1078     
// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
1079     whitespace =
"[\\x20\\t\\r\\n\\f]",
1080     
// http://www.w3.org/TR/css3-syntax/#characters
1081     characterEncoding =
"(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
1082
1083     
// Loosely modeled on CSS identifier characters
1084     
// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
1085     
// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
1086     identifier = characterEncoding.replace(
"w", "w#" ),
1087
1088     
// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
1089     attributes =
"\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
1090         
"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
1091
1092     
// Prefer arguments quoted,
1093     
// then not containing pseudos/brackets,
1094     
// then attribute selectors/non-parenthetical expressions,
1095     
// then anything else
1096     
// These preferences are here to reduce the number of selectors
1097     
// needing tokenize in the PSEUDO preFilter
1098     pseudos =
":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
1099
1100     
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
1101     rtrim =
new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
1102
1103     rcomma =
new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
1104     rcombinators =
new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
1105
1106     rsibling =
new RegExp( whitespace + "*[+~]" ),
1107     rattributeQuotes =
new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
1108
1109     rpseudo =
new RegExp( pseudos ),
1110     ridentifier =
new RegExp( "^" + identifier + "$" ),
1111
1112     matchExpr = {
1113         
"ID": new RegExp( "^#(" + characterEncoding + ")" ),
1114         
"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
1115         
"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
1116         
"ATTR": new RegExp( "^" + attributes ),
1117         
"PSEUDO": new RegExp( "^" + pseudos ),
1118         
"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
1119             
"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
1120             
"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
1121         
"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
1122         
// For use in libraries implementing .is()
1123         
// We use this for POS matching in `select`
1124         
"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
1125             whitespace +
"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
1126     },
1127
1128     rnative = /^[^{]+\{\s*\[native \w/,
1129
1130     
// Easily-parseable/retrievable ID or TAG or CLASS selectors
1131     rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
1132
1133     rinputs = /^(?:input|
select|textarea|button)$/i,
1134     rheader = /^h\d$/i,
1135
1136     rescape = /
'|\\/g,
1137
1138     
// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
1139     runescape =
new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
1140     funescape = function( _, escaped, escapedWhitespace ) {
1141         
var high = "0x" + escaped - 0x10000;
1142         
// NaN means non-codepoint
1143         
// Support: Firefox
1144         
// Workaround erroneous numeric interpretation of +"0x"
1145         
return high !== high || escapedWhitespace ?
1146             escaped :
1147             
// BMP codepoint
1148             high <
0 ?
1149                 String.fromCharCode( high +
0x10000 ) :
1150                 
// Supplemental Plane codepoint (surrogate pair)
1151                 String.fromCharCode( high >>
10 | 0xD800, high & 0x3FF | 0xDC00 );
1152     };

1153
1154 // Optimize
for push.apply( _, NodeList )
1155 try
{
1156     push.apply(
1157         (arr = slice.call( preferredDoc.childNodes )),
1158         preferredDoc.childNodes
1159     );
1160     
// Support: Android<4.0
1161     
// Detect silently failing push.apply
1162     arr[ preferredDoc.childNodes.length ].nodeType;
1163 }
catch ( e ) {
1164     push = { apply: arr.length ?
1165
1166         
// Leverage slice if possible
1167         function( target, els ) {
1168             push_native.apply( target, slice.call(els) );
1169         } :
1170
1171         
// Support: IE<9
1172         
// Otherwise append directly
1173         function( target, els ) {
1174             
var j = target.length,
1175                 i =
0;
1176             
// Can't trust NodeList.length
1177             
while ( (target[j++] = els[i++]) ) {}
1178             target.length = j -
1;
1179         }
1180     };
1181 }
1182
1183 function Sizzle( selector, context, results, seed ) {
1184     
var match, elem, m, nodeType,
1185         
// QSA vars
1186         i, groups, old, nid, newContext, newSelector;
1187
1188     
if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
1189         setDocument( context );
1190     }
1191
1192     context = context || document;
1193     results = results || [];
1194
1195     
if ( !selector || typeof selector !== "string" ) {
1196         
return results;
1197     }
1198
1199     
if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
1200         
return [];
1201     }
1202
1203     
if ( documentIsHTML && !seed ) {
1204
1205         
// Shortcuts
1206         
if ( (match = rquickExpr.exec( selector )) ) {
1207             
// Speed-up: Sizzle("#ID")
1208             
if ( (m = match[1]) ) {
1209                 
if ( nodeType === 9 ) {
1210                     elem = context.getElementById( m );
1211                     
// Check parentNode to catch when Blackberry 4.6 returns
1212                     
// nodes that are no longer in the document #6963
1213                     
if ( elem && elem.parentNode ) {
1214                         
// Handle the case where IE, Opera, and Webkit return items
1215                         
// by name instead of ID
1216                         
if ( elem.id === m ) {
1217                             results.push( elem );
1218                             
return results;
1219                         }
1220                     }
else {
1221                         
return results;
1222                     }
1223                 }
else {
1224                     
// Context is not a document
1225                     
if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
1226                         contains( context, elem ) && elem.id === m ) {
1227                         results.push( elem );
1228                         
return results;
1229                     }
1230                 }
1231
1232             
// Speed-up: Sizzle("TAG")
1233             }
else if ( match[2] ) {
1234                 push.apply( results, context.getElementsByTagName( selector ) );
1235                 
return results;
1236
1237             
// Speed-up: Sizzle(".CLASS")
1238             }
else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
1239                 push.apply( results, context.getElementsByClassName( m ) );
1240                 
return results;
1241             }
1242         }
1243
1244         
// QSA path
1245         
if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
1246             nid = old = expando;
1247             newContext = context;
1248             newSelector = nodeType ===
9 && selector;
1249
1250             
// qSA works strangely on Element-rooted queries
1251             
// We can work around this by specifying an extra ID on the root
1252             
// and working up from there (Thanks to Andrew Dupont for the technique)
1253             
// IE 8 doesn't work on object elements
1254             
if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
1255                 groups = tokenize( selector );
1256
1257                 
if ( (old = context.getAttribute("id")) ) {
1258                     nid = old.replace( rescape,
"\\$&" );
1259                 }
else {
1260                     context.setAttribute(
"id", nid );
1261                 }
1262                 nid =
"[id='" + nid + "'] ";
1263
1264                 i = groups.length;
1265                 
while ( i-- ) {
1266                     groups[i] = nid + toSelector( groups[i] );
1267                 }
1268                 newContext = rsibling.test( selector ) && context.parentNode || context;
1269                 newSelector = groups.
join(",");
1270             }
1271
1272             
if ( newSelector ) {
1273                 
try {
1274                     push.apply( results,
1275                         newContext.querySelectorAll( newSelector )
1276                     );
1277                     
return results;
1278                 }
catch(qsaError) {
1279                 }
finally {
1280                     
if ( !old ) {
1281                         context.removeAttribute(
"id");
1282                     }
1283                 }
1284             }
1285         }
1286     }
1287
1288     
// All others
1289     
return select( selector.replace( rtrim, "$1" ), context, results, seed );
1290 }

1291
1292 /**
1293  * Create key-
value caches of limited size
1294  * @returns {Function(
string, Object)} Returns the Object data after storing it on itself with
1295  * property name the (space-suffixed)
string and (if the cache is larger than Expr.cacheLength)
1296  * deleting the oldest entry
1297  */

1298 function createCache() {
1299     
var keys = [];
1300
1301     function cache( key,
value ) {
1302         
// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
1303         
if ( keys.push( key += " " ) > Expr.cacheLength ) {
1304             
// Only keep the most recent entries
1305             delete cache[ keys.shift() ];
1306         }
1307         
return (cache[ key ] = value);
1308     }
1309     
return cache;
1310 }

1311
1312 /**
1313  * Mark a function
for special use by Sizzle
1314  * @param {Function} fn The function to mark
1315  */

1316 function markFunction( fn ) {
1317     fn[ expando ] =
true;
1318     
return fn;
1319 }

1320
1321 /**
1322  * Support testing
using an element
1323  * @param {Function} fn Passed the created div and expects a boolean result
1324  */

1325 function assert( fn ) {
1326     
var div = document.createElement("div");
1327
1328     
try {
1329         
return !!fn( div );
1330     }
catch (e) {
1331         
return false;
1332     }
finally {
1333         
// Remove from its parent by default
1334         
if ( div.parentNode ) {
1335             div.parentNode.removeChild( div );
1336         }
1337         
// release memory in IE
1338         div =
null;
1339     }
1340 }

1341
1342 /**
1343  * Adds the same handler
for all of the specified attrs
1344  * @param {String} attrs Pipe-separated list of attributes
1345  * @param {Function} handler The method that will be applied
1346  */

1347 function addHandle( attrs, handler ) {
1348     
var arr = attrs.split("|"),
1349         i = attrs.length;
1350
1351     
while ( i-- ) {
1352         Expr.attrHandle[ arr[i] ] = handler;
1353     }
1354 }

1355
1356 /**
1357  * Checks document order of two siblings
1358  * @param {Element} a
1359  * @param {Element} b
1360  * @returns {Number} Returns less than
0 if a precedes b, greater than 0 if a follows b
1361  */

1362 function siblingCheck( a, b ) {
1363     
var cur = b && a,
1364         diff = cur && a.nodeType ===
1 && b.nodeType === 1 &&
1365             ( ~b.sourceIndex || MAX_NEGATIVE ) -
1366             ( ~a.sourceIndex || MAX_NEGATIVE );
1367
1368     
// Use IE sourceIndex if available on both nodes
1369     
if ( diff ) {
1370         
return diff;
1371     }
1372
1373     
// Check if b follows a
1374     
if ( cur ) {
1375         
while ( (cur = cur.nextSibling) ) {
1376             
if ( cur === b ) {
1377                 
return -1;
1378             }
1379         }
1380     }
1381
1382     
return a ? 1 : -1;
1383 }

1384
1385 /**
1386  * Returns a function to use
in pseudos for input types
1387  * @param {String} type
1388  */

1389 function createInputPseudo( type ) {
1390     
return function( elem ) {
1391         
var name = elem.nodeName.toLowerCase();
1392         
return name === "input" && elem.type === type;
1393     };
1394 }

1395
1396 /**
1397  * Returns a function to use
in pseudos for buttons
1398  * @param {String} type
1399  */

1400 function createButtonPseudo( type ) {
1401     
return function( elem ) {
1402         
var name = elem.nodeName.toLowerCase();
1403         
return (name === "input" || name === "button") && elem.type === type;
1404     };
1405 }

1406
1407 /**
1408  * Returns a function to use
in pseudos for positionals
1409  * @param {Function} fn
1410  */

1411 function createPositionalPseudo( fn ) {
1412     
return markFunction(function( argument ) {
1413         argument = +argument;
1414         
return markFunction(function( seed, matches ) {
1415             
var j,
1416                 matchIndexes = fn( [], seed.length, argument ),
1417                 i = matchIndexes.length;
1418
1419             
// Match elements found at the specified indexes
1420             
while ( i-- ) {
1421                 
if ( seed[ (j = matchIndexes[i]) ] ) {
1422                     seed[j] = !(matches[j] = seed[j]);
1423                 }
1424             }
1425         });
1426     });
1427 }

1428
1429 /**
1430  * Detect xml
1431  * @param {Element|Object} elem An element or a document
1432  */

1433 isXML = Sizzle.isXML = function( elem ) {
1434     
// documentElement is verified for cases where it doesn't yet exist
1435     
// (such as loading iframes in IE - #4833)
1436     
var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1437     
return documentElement ? documentElement.nodeName !== "HTML" : false;
1438 };

1439
1440 // Expose support vars
for convenience
1441 support = Sizzle.support = {};

1442
1443 /**
1444  * Sets document-related variables once based
on the current document
1445  * @param {Element|Object} [doc] An element or document
object to use to set the document
1446  * @returns {Object} Returns the current document
1447  */

1448 setDocument = Sizzle.setDocument = function( node ) {
1449     
var doc = node ? node.ownerDocument || node : preferredDoc,
1450         parent = doc.defaultView;
1451
1452     
// If no document and documentElement is available, return
1453     
if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1454         
return document;
1455     }
1456
1457     
// Set our document
1458     document = doc;
1459     docElem = doc.documentElement;
1460
1461     
// Support tests
1462     documentIsHTML = !isXML( doc );
1463
1464     
// Support: IE>8
1465     
// If iframe document is assigned to "document" variable and if iframe has been reloaded,
1466     
// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1467     
// IE6-8 do not support the defaultView property so parent will be undefined
1468     
if ( parent && parent.attachEvent && parent !== parent.top ) {
1469         parent.attachEvent(
"onbeforeunload", function() {
1470             setDocument();
1471         });
1472     }
1473
1474     
/* Attributes
1475     ---------------------------------------------------------------------- */

1476
1477     
// Support: IE<8
1478     
// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
1479     support.attributes = assert(function( div ) {
1480         div.className =
"i";
1481         
return !div.getAttribute("className");
1482     });
1483
1484     
/* getElement(s)By*
1485     ---------------------------------------------------------------------- */

1486
1487     
// Check if getElementsByTagName("*") returns only elements
1488     support.getElementsByTagName = assert(function( div ) {
1489         div.appendChild( doc.createComment(
"") );
1490         
return !div.getElementsByTagName("*").length;
1491     });
1492
1493     
// Check if getElementsByClassName can be trusted
1494     support.getElementsByClassName = assert(function( div ) {
1495         div.innerHTML =
"<div class='a'></div><div class='a i'></div>";
1496
1497         
// Support: Safari<4
1498         
// Catch class over-caching
1499         div.firstChild.className =
"i";
1500         
// Support: Opera<10
1501         
// Catch gEBCN failure to find non-leading classes
1502         
return div.getElementsByClassName("i").length === 2;
1503     });
1504
1505     
// Support: IE<10
1506     
// Check if getElementById returns elements by name
1507     
// The broken getElementById methods don't pick up programatically-set names,
1508     
// so use a roundabout getElementsByName test
1509     support.getById = assert(function( div ) {
1510         docElem.appendChild( div ).id = expando;
1511         
return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
1512     });
1513
1514     
// ID find and filter
1515     
if ( support.getById ) {
1516         Expr.find[
"ID"] = function( id, context ) {
1517             
if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
1518                 
var m = context.getElementById( id );
1519                 
// Check parentNode to catch when Blackberry 4.6 returns
1520                 
// nodes that are no longer in the document #6963
1521                 
return m && m.parentNode ? [m] : [];
1522             }
1523         };
1524         Expr.filter[
"ID"] = function( id ) {
1525             
var attrId = id.replace( runescape, funescape );
1526             
return function( elem ) {
1527                 
return elem.getAttribute("id") === attrId;
1528             };
1529         };
1530     }
else {
1531         
// Support: IE6/7
1532         
// getElementById is not reliable as a find shortcut
1533         delete Expr.find[
"ID"];
1534
1535         Expr.filter[
"ID"] = function( id ) {
1536             
var attrId = id.replace( runescape, funescape );
1537             
return function( elem ) {
1538                 
var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
1539                 
return node && node.value === attrId;
1540             };
1541         };
1542     }
1543
1544     
// Tag
1545     Expr.find[
"TAG"] = support.getElementsByTagName ?
1546         function( tag, context ) {
1547             
if ( typeof context.getElementsByTagName !== strundefined ) {
1548                 
return context.getElementsByTagName( tag );
1549             }
1550         } :
1551         function( tag, context ) {
1552             
var elem,
1553                 tmp = [],
1554                 i =
0,
1555                 results = context.getElementsByTagName( tag );
1556
1557             
// Filter out possible comments
1558             
if ( tag === "*" ) {
1559                 
while ( (elem = results[i++]) ) {
1560                     
if ( elem.nodeType === 1 ) {
1561                         tmp.push( elem );
1562                     }
1563                 }
1564
1565                 
return tmp;
1566             }
1567             
return results;
1568         };
1569
1570     
// Class
1571     Expr.find[
"CLASS"] = support.getElementsByClassName && function( className, context ) {
1572         
if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
1573             
return context.getElementsByClassName( className );
1574         }
1575     };
1576
1577     
/* QSA/matchesSelector
1578     ---------------------------------------------------------------------- */

1579
1580     
// QSA and matchesSelector support
1581
1582     
// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1583     rbuggyMatches = [];
1584
1585     
// qSa(:focus) reports false when true (Chrome 21)
1586     
// We allow this because of a bug in IE8/9 that throws an error
1587     
// whenever `document.activeElement` is accessed on an iframe
1588     
// So, we allow :focus to pass through QSA all the time to avoid the IE error
1589     
// See http://bugs.jquery.com/ticket/13378
1590     rbuggyQSA = [];
1591
1592     
if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
1593         
// Build QSA regex
1594         
// Regex strategy adopted from Diego Perini
1595         assert(function( div ) {
1596             
// Select is set to empty string on purpose
1597             
// This is to test IE's treatment of not explicitly
1598             
// setting a boolean content attribute,
1599             
// since its presence should be enough
1600             
// http://bugs.jquery.com/ticket/12359
1601             div.innerHTML =
"<select><option selected=''></option></select>";
1602
1603             
// Support: IE8
1604             
// Boolean attributes and "value" are not treated correctly
1605             
if ( !div.querySelectorAll("[selected]").length ) {
1606                 rbuggyQSA.push(
"\\[" + whitespace + "*(?:value|" + booleans + ")" );
1607             }
1608
1609             
// Webkit/Opera - :checked should return selected option elements
1610             
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1611             
// IE8 throws error here and will not see later tests
1612             
if ( !div.querySelectorAll(":checked").length ) {
1613                 rbuggyQSA.push(
":checked");
1614             }
1615         });
1616
1617         assert(function( div ) {
1618
1619             
// Support: Opera 10-12/IE8
1620             
// ^= $= *= and empty values
1621             
// Should not select anything
1622             
// Support: Windows 8 Native Apps
1623             
// The type attribute is restricted during .innerHTML assignment
1624             
var input = doc.createElement("input");
1625             input.setAttribute(
"type", "hidden" );
1626             div.appendChild( input ).setAttribute(
"t", "" );
1627
1628             
if ( div.querySelectorAll("[t^='']").length ) {
1629                 rbuggyQSA.push(
"[*^$]=" + whitespace + "*(?:''|\"\")" );
1630             }
1631
1632             
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1633             
// IE8 throws error here and will not see later tests
1634             
if ( !div.querySelectorAll(":enabled").length ) {
1635                 rbuggyQSA.push(
":enabled", ":disabled" );
1636             }
1637
1638             
// Opera 10-11 does not throw on post-comma invalid pseudos
1639             div.querySelectorAll(
"*,:x");
1640             rbuggyQSA.push(
",.*:");
1641         });
1642     }
1643
1644     
if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
1645         docElem.mozMatchesSelector ||
1646         docElem.oMatchesSelector ||
1647         docElem.msMatchesSelector) )) ) {
1648
1649         assert(function( div ) {
1650             
// Check to see if it's possible to do matchesSelector
1651             
// on a disconnected node (IE 9)
1652             support.disconnectedMatch = matches.call( div,
"div" );
1653
1654             
// This should fail with an exception
1655             
// Gecko does not error, returns false instead
1656             matches.call( div,
"[s!='']:x" );
1657             rbuggyMatches.push(
"!=", pseudos );
1658         });
1659     }
1660
1661     rbuggyQSA = rbuggyQSA.length &&
new RegExp( rbuggyQSA.join("|") );
1662     rbuggyMatches = rbuggyMatches.length &&
new RegExp( rbuggyMatches.join("|") );
1663
1664     
/* Contains
1665     ---------------------------------------------------------------------- */

1666
1667     
// Element contains another
1668     
// Purposefully does not implement inclusive descendent
1669     
// As in, an element does not contain itself
1670     contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
1671         function( a, b ) {
1672             
var adown = a.nodeType === 9 ? a.documentElement : a,
1673                 bup = b && b.parentNode;
1674             
return a === bup || !!( bup && bup.nodeType === 1 && (
1675                 adown.contains ?
1676                     adown.contains( bup ) :
1677                     a.compareDocumentPosition && a.compareDocumentPosition( bup ) &
16
1678             ));
1679         } :
1680         function( a, b ) {
1681             
if ( b ) {
1682                 
while ( (b = b.parentNode) ) {
1683                     
if ( b === a ) {
1684                         
return true;
1685                     }
1686                 }
1687             }
1688             
return false;
1689         };
1690
1691     
/* Sorting
1692     ---------------------------------------------------------------------- */

1693
1694     
// Document order sorting
1695     sortOrder = docElem.compareDocumentPosition ?
1696     function( a, b ) {
1697
1698         
// Flag for duplicate removal
1699         
if ( a === b ) {
1700             hasDuplicate =
true;
1701             
return 0;
1702         }
1703
1704         
var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
1705
1706         
if ( compare ) {
1707             
// Disconnected nodes
1708             
if ( compare & 1 ||
1709                 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1710
1711                 
// Choose the first element that is related to our preferred document
1712                 
if ( a === doc || contains(preferredDoc, a) ) {
1713                     
return -1;
1714                 }
1715                 
if ( b === doc || contains(preferredDoc, b) ) {
1716                     
return 1;
1717                 }
1718
1719                 
// Maintain original order
1720                 
return sortInput ?
1721                     ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1722                     
0;
1723             }
1724
1725             
return compare & 4 ? -1 : 1;
1726         }
1727
1728         
// Not directly comparable, sort on existence of method
1729         
return a.compareDocumentPosition ? -1 : 1;
1730     } :
1731     function( a, b ) {
1732         
var cur,
1733             i =
0,
1734             aup = a.parentNode,
1735             bup = b.parentNode,
1736             ap = [ a ],
1737             bp = [ b ];
1738
1739         
// Exit early if the nodes are identical
1740         
if ( a === b ) {
1741             hasDuplicate =
true;
1742             
return 0;
1743
1744         
// Parentless nodes are either documents or disconnected
1745         }
else if ( !aup || !bup ) {
1746             
return a === doc ? -1 :
1747                 b === doc ?
1 :
1748                 aup ? -
1 :
1749                 bup ?
1 :
1750                 sortInput ?
1751                 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1752                 
0;
1753
1754         
// If the nodes are siblings, we can do a quick check
1755         }
else if ( aup === bup ) {
1756             
return siblingCheck( a, b );
1757         }
1758
1759         
// Otherwise we need full lists of their ancestors for comparison
1760         cur = a;
1761         
while ( (cur = cur.parentNode) ) {
1762             ap.unshift( cur );
1763         }
1764         cur = b;
1765         
while ( (cur = cur.parentNode) ) {
1766             bp.unshift( cur );
1767         }
1768
1769         
// Walk down the tree looking for a discrepancy
1770         
while ( ap[i] === bp[i] ) {
1771             i++;
1772         }
1773
1774         
return i ?
1775             
// Do a sibling check if the nodes have a common ancestor
1776             siblingCheck( ap[i], bp[i] ) :
1777
1778             
// Otherwise nodes in our document sort first
1779             ap[i] === preferredDoc ? -
1 :
1780             bp[i] === preferredDoc ?
1 :
1781             
0;
1782     };
1783
1784     
return doc;
1785 };
1786
1787 Sizzle.matches = function( expr, elements ) {
1788     
return Sizzle( expr, null, null, elements );
1789 };
1790
1791 Sizzle.matchesSelector = function( elem, expr ) {
1792     
// Set document vars if needed
1793     
if ( ( elem.ownerDocument || elem ) !== document ) {
1794         setDocument( elem );
1795     }
1796
1797     
// Make sure that attribute selectors are quoted
1798     expr = expr.replace( rattributeQuotes,
"='$1']" );
1799
1800     
if ( support.matchesSelector && documentIsHTML &&
1801         ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1802         ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1803
1804         
try {
1805             
var ret = matches.call( elem, expr );
1806
1807             
// IE 9's matchesSelector returns false on disconnected nodes
1808             
if ( ret || support.disconnectedMatch ||
1809                     
// As well, disconnected nodes are said to be in a document
1810                     
// fragment in IE 9
1811                     elem.document && elem.document.nodeType !==
11 ) {
1812                 
return ret;
1813             }
1814         }
catch(e) {}
1815     }
1816
1817     
return Sizzle( expr, document, null, [elem] ).length > 0;
1818 };
1819
1820 Sizzle.contains = function( context, elem ) {
1821     
// Set document vars if needed
1822     
if ( ( context.ownerDocument || context ) !== document ) {
1823         setDocument( context );
1824     }
1825     
return contains( context, elem );
1826 };
1827
1828 Sizzle.attr = function( elem, name ) {
1829     
// Set document vars if needed
1830     
if ( ( elem.ownerDocument || elem ) !== document ) {
1831         setDocument( elem );
1832     }
1833
1834     
var fn = Expr.attrHandle[ name.toLowerCase() ],
1835         
// Don't get fooled by Object.prototype properties (jQuery #13807)
1836         val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1837             fn( elem, name, !documentIsHTML ) :
1838             undefined;
1839
1840     
return val === undefined ?
1841         support.attributes || !documentIsHTML ?
1842             elem.getAttribute( name ) :
1843             (val = elem.getAttributeNode(name)) && val.specified ?
1844                 val.
value :
1845                 
null :
1846         val;
1847 };
1848
1849 Sizzle.error = function( msg ) {
1850     
throw new Error( "Syntax error, unrecognized expression: " + msg );
1851 };

1852
1853 /**
1854  * Document sorting and removing duplicates
1855  * @param {ArrayLike} results
1856  */

1857 Sizzle.uniqueSort = function( results ) {
1858     
var elem,
1859         duplicates = [],
1860         j =
0,
1861         i =
0;
1862
1863     
// Unless we *know* we can detect duplicates, assume their presence
1864     hasDuplicate = !support.detectDuplicates;
1865     sortInput = !support.sortStable && results.slice(
0 );
1866     results.sort( sortOrder );
1867
1868     
if ( hasDuplicate ) {
1869         
while ( (elem = results[i++]) ) {
1870             
if ( elem === results[ i ] ) {
1871                 j = duplicates.push( i );
1872             }
1873         }
1874         
while ( j-- ) {
1875             results.splice( duplicates[ j ],
1 );
1876         }
1877     }
1878
1879     
return results;
1880 };

1881
1882 /**
1883  * Utility function
for retrieving the text value of an array of DOM nodes
1884  * @param {Array|Element} elem
1885  */

1886 getText = Sizzle.getText = function( elem ) {
1887     
var node,
1888         ret =
"",
1889         i =
0,
1890         nodeType = elem.nodeType;
1891
1892     
if ( !nodeType ) {
1893         
// If no nodeType, this is expected to be an array
1894         
for ( ; (node = elem[i]); i++ ) {
1895             
// Do not traverse comment nodes
1896             ret += getText( node );
1897         }
1898     }
else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1899         
// Use textContent for elements
1900         
// innerText usage removed for consistency of new lines (see #11153)
1901         
if ( typeof elem.textContent === "string" ) {
1902             
return elem.textContent;
1903         }
else {
1904             
// Traverse its children
1905             
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1906                 ret += getText( elem );
1907             }
1908         }
1909     }
else if ( nodeType === 3 || nodeType === 4 ) {
1910         
return elem.nodeValue;
1911     }
1912     
// Do not include comment or processing instruction nodes
1913
1914     
return ret;
1915 };
1916
1917 Expr = Sizzle.selectors = {
1918
1919     
// Can be adjusted by the user
1920     cacheLength:
50,
1921
1922     createPseudo: markFunction,
1923
1924     match: matchExpr,
1925
1926     attrHandle: {},
1927
1928     find: {},
1929
1930     relative: {
1931         
">": { dir: "parentNode", first: true },
1932         
" ": { dir: "parentNode" },
1933         
"+": { dir: "previousSibling", first: true },
1934         
"~": { dir: "previousSibling" }
1935     },
1936
1937     preFilter: {
1938         
"ATTR": function( match ) {
1939             match[
1] = match[1].replace( runescape, funescape );
1940
1941             
// Move the given value to match[3] whether quoted or unquoted
1942             match[
3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
1943
1944             
if ( match[2] === "~=" ) {
1945                 match[
3] = " " + match[3] + " ";
1946             }
1947
1948             
return match.slice( 0, 4 );
1949         },
1950
1951         
"CHILD": function( match ) {
1952             
/* matches from matchExpr["CHILD"]
1953                 
1 type (only|nth|...)
1954                 
2 what (child|of-type)
1955                 
3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1956                 
4 xn-component of xn+y argument ([+-]?\d*n|)
1957                 
5 sign of xn-component
1958                 
6 x of xn-component
1959                 
7 sign of y-component
1960                 
8 y of y-component
1961             */

1962             match[
1] = match[1].toLowerCase();
1963
1964             
if ( match[1].slice( 0, 3 ) === "nth" ) {
1965                 
// nth-* requires argument
1966                 
if ( !match[3] ) {
1967                     Sizzle.error( match[
0] );
1968                 }
1969
1970                 
// numeric x and y parameters for Expr.filter.CHILD
1971                 
// remember that false/true cast respectively to 0/1
1972                 match[
4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1973                 match[
5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1974
1975             
// other types prohibit arguments
1976             }
else if ( match[3] ) {
1977                 Sizzle.error( match[
0] );
1978             }
1979
1980             
return match;
1981         },
1982
1983         
"PSEUDO": function( match ) {
1984             
var excess,
1985                 unquoted = !match[
5] && match[2];
1986
1987             
if ( matchExpr["CHILD"].test( match[0] ) ) {
1988                 
return null;
1989             }
1990
1991             
// Accept quoted arguments as-is
1992             
if ( match[3] && match[4] !== undefined ) {
1993                 match[
2] = match[4];
1994
1995             
// Strip excess characters from unquoted arguments
1996             }
else if ( unquoted && rpseudo.test( unquoted ) &&
1997                 
// Get excess from tokenize (recursively)
1998                 (excess = tokenize( unquoted,
true )) &&
1999                 
// advance to the next closing parenthesis
2000                 (excess = unquoted.indexOf(
")", unquoted.length - excess ) - unquoted.length) ) {
2001
2002                 
// excess is a negative index
2003                 match[
0] = match[0].slice( 0, excess );
2004                 match[
2] = unquoted.slice( 0, excess );
2005             }
2006
2007             
// Return only captures needed by the pseudo filter method (type and argument)
2008             
return match.slice( 0, 3 );
2009         }
2010     },
2011
2012     filter: {
2013
2014         
"TAG": function( nodeNameSelector ) {
2015             
var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
2016             
return nodeNameSelector === "*" ?
2017                 function() {
return true; } :
2018                 function( elem ) {
2019                     
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
2020                 };
2021         },
2022
2023         
"CLASS": function( className ) {
2024             
var pattern = classCache[ className + " " ];
2025
2026             
return pattern ||
2027                 (pattern =
new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
2028                 classCache( className, function( elem ) {
2029                     
return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
2030                 });
2031         },
2032
2033         
"ATTR": function( name, operator, check ) {
2034             
return function( elem ) {
2035                 
var result = Sizzle.attr( elem, name );
2036
2037                 
if ( result == null ) {
2038                     
return operator === "!=";
2039                 }
2040                 
if ( !operator ) {
2041                     
return true;
2042                 }
2043
2044                 result +=
"";
2045
2046                 
return operator === "=" ? result === check :
2047                     
operator === "!=" ? result !== check :
2048                     
operator === "^=" ? check && result.indexOf( check ) === 0 :
2049                     
operator === "*=" ? check && result.indexOf( check ) > -1 :
2050                     
operator === "$=" ? check && result.slice( -check.length ) === check :
2051                     
operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
2052                     
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
2053                     
false;
2054             };
2055         },
2056
2057         
"CHILD": function( type, what, argument, first, last ) {
2058             
var simple = type.slice( 0, 3 ) !== "nth",
2059                 forward = type.slice( -
4 ) !== "last",
2060                 ofType = what ===
"of-type";
2061
2062             
return first === 1 && last === 0 ?
2063
2064                 
// Shortcut for :nth-*(n)
2065                 function( elem ) {
2066                     
return !!elem.parentNode;
2067                 } :
2068
2069                 function( elem, context, xml ) {
2070                     
var cache, outerCache, node, diff, nodeIndex, start,
2071                         dir = simple !== forward ?
"nextSibling" : "previousSibling",
2072                         parent = elem.parentNode,
2073                         name = ofType && elem.nodeName.toLowerCase(),
2074                         useCache = !xml && !ofType;
2075
2076                     
if ( parent ) {
2077
2078                         
// :(first|last|only)-(child|of-type)
2079                         
if ( simple ) {
2080                             
while ( dir ) {
2081                                 node = elem;
2082                                 
while ( (node = node[ dir ]) ) {
2083                                     
if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
2084                                         
return false;
2085                                     }
2086                                 }
2087                                 
// Reverse direction for :only-* (if we haven't yet done so)
2088                                 start = dir = type ===
"only" && !start && "nextSibling";
2089                             }
2090                             
return true;
2091                         }
2092
2093                         start = [ forward ? parent.firstChild : parent.lastChild ];
2094
2095                         
// non-xml :nth-child(...) stores cache data on `parent`
2096                         
if ( forward && useCache ) {
2097                             
// Seek `elem` from a previously-cached index
2098                             outerCache = parent[ expando ] || (parent[ expando ] = {});
2099                             cache = outerCache[ type ] || [];
2100                             nodeIndex = cache[
0] === dirruns && cache[1];
2101                             diff = cache[
0] === dirruns && cache[2];
2102                             node = nodeIndex && parent.childNodes[ nodeIndex ];
2103
2104                             
while ( (node = ++nodeIndex && node && node[ dir ] ||
2105
2106                                 
// Fallback to seeking `elem` from the start
2107                                 (diff = nodeIndex =
0) || start.pop()) ) {
2108
2109                                 
// When found, cache indexes on `parent` and break
2110                                 
if ( node.nodeType === 1 && ++diff && node === elem ) {
2111                                     outerCache[ type ] = [ dirruns, nodeIndex, diff ];
2112                                     
break;
2113                                 }
2114                             }
2115
2116                         
// Use previously-cached element index if available
2117                         }
else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
2118                             diff = cache[
1];
2119
2120                         
// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
2121                         }
else {
2122                             
// Use the same loop as above to seek `elem` from the start
2123                             
while ( (node = ++nodeIndex && node && node[ dir ] ||
2124                                 (diff = nodeIndex =
0) || start.pop()) ) {
2125
2126                                 
if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
2127                                     
// Cache the index of each encountered element
2128                                     
if ( useCache ) {
2129                                         (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
2130                                     }
2131
2132                                     
if ( node === elem ) {
2133                                         
break;
2134                                     }
2135                                 }
2136                             }
2137                         }
2138
2139                         
// Incorporate the offset, then check against cycle size
2140                         diff -= last;
2141                         
return diff === first || ( diff % first === 0 && diff / first >= 0 );
2142                     }
2143                 };
2144         },
2145
2146         
"PSEUDO": function( pseudo, argument ) {
2147             
// pseudo-class names are case-insensitive
2148             
// http://www.w3.org/TR/selectors/#pseudo-classes
2149             
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2150             
// Remember that setFilters inherits from pseudos
2151             
var args,
2152                 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2153                     Sizzle.error(
"unsupported pseudo: " + pseudo );
2154
2155             
// The user may use createPseudo to indicate that
2156             
// arguments are needed to create the filter function
2157             
// just as Sizzle does
2158             
if ( fn[ expando ] ) {
2159                 
return fn( argument );
2160             }
2161
2162             
// But maintain support for old signatures
2163             
if ( fn.length > 1 ) {
2164                 args = [ pseudo, pseudo,
"", argument ];
2165                 
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2166                     markFunction(function( seed, matches ) {
2167                         
var idx,
2168                             matched = fn( seed, argument ),
2169                             i = matched.length;
2170                         
while ( i-- ) {
2171                             idx = indexOf.call( seed, matched[i] );
2172                             seed[ idx ] = !( matches[ idx ] = matched[i] );
2173                         }
2174                     }) :
2175                     function( elem ) {
2176                         
return fn( elem, 0, args );
2177                     };
2178             }
2179
2180             
return fn;
2181         }
2182     },
2183
2184     pseudos: {
2185         
// Potentially complex pseudos
2186         
"not": markFunction(function( selector ) {
2187             
// Trim the selector passed to compile
2188             
// to avoid treating leading and trailing
2189             
// spaces as combinators
2190             
var input = [],
2191                 results = [],
2192                 matcher = compile( selector.replace( rtrim,
"$1" ) );
2193
2194             
return matcher[ expando ] ?
2195                 markFunction(function( seed, matches, context, xml ) {
2196                     
var elem,
2197                         unmatched = matcher( seed,
null, xml, [] ),
2198                         i = seed.length;
2199
2200                     
// Match elements unmatched by `matcher`
2201                     
while ( i-- ) {
2202                         
if ( (elem = unmatched[i]) ) {
2203                             seed[i] = !(matches[i] = elem);
2204                         }
2205                     }
2206                 }) :
2207                 function( elem, context, xml ) {
2208                     input[
0] = elem;
2209                     matcher( input,
null, xml, results );
2210                     
return !results.pop();
2211                 };
2212         }),
2213
2214         
"has": markFunction(function( selector ) {
2215             
return function( elem ) {
2216                 
return Sizzle( selector, elem ).length > 0;
2217             };
2218         }),
2219
2220         
"contains": markFunction(function( text ) {
2221             
return function( elem ) {
2222                 
return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2223             };
2224         }),
2225
2226         
// "Whether an element is represented by a :lang() selector
2227         
// is based solely on the element's language value
2228         
// being equal to the identifier C,
2229         
// or beginning with the identifier C immediately followed by "-".
2230         
// The matching of C against the element's language value is performed case-insensitively.
2231         
// The identifier C does not have to be a valid language name."
2232         
// http://www.w3.org/TR/selectors/#lang-pseudo
2233         
"lang": markFunction( function( lang ) {
2234             
// lang value must be a valid identifier
2235             
if ( !ridentifier.test(lang || "") ) {
2236                 Sizzle.error(
"unsupported lang: " + lang );
2237             }
2238             lang = lang.replace( runescape, funescape ).toLowerCase();
2239             
return function( elem ) {
2240                 
var elemLang;
2241                 
do {
2242                     
if ( (elemLang = documentIsHTML ?
2243                         elem.lang :
2244                         elem.getAttribute(
"xml:lang") || elem.getAttribute("lang")) ) {
2245
2246                         elemLang = elemLang.toLowerCase();
2247                         
return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2248                     }
2249                 }
while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2250                 
return false;
2251             };
2252         }),
2253
2254         
// Miscellaneous
2255         
"target": function( elem ) {
2256             
var hash = window.location && window.location.hash;
2257             
return hash && hash.slice( 1 ) === elem.id;
2258         },
2259
2260         
"root": function( elem ) {
2261             
return elem === docElem;
2262         },
2263
2264         
"focus": function( elem ) {
2265             
return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2266         },
2267
2268         
// Boolean properties
2269         
"enabled": function( elem ) {
2270             
return elem.disabled === false;
2271         },
2272
2273         
"disabled": function( elem ) {
2274             
return elem.disabled === true;
2275         },
2276
2277         
"checked": function( elem ) {
2278             
// In CSS3, :checked should return both checked and selected elements
2279             
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2280             
var nodeName = elem.nodeName.toLowerCase();
2281             
return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2282         },
2283
2284         
"selected": function( elem ) {
2285             
// Accessing this property makes selected-by-default
2286             
// options in Safari work properly
2287             
if ( elem.parentNode ) {
2288                 elem.parentNode.selectedIndex;
2289             }
2290
2291             
return elem.selected === true;
2292         },
2293
2294         
// Contents
2295         
"empty": function( elem ) {
2296             
// http://www.w3.org/TR/selectors/#empty-pseudo
2297             
// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
2298             
// not comment, processing instructions, or others
2299             
// Thanks to Diego Perini for the nodeName shortcut
2300             
// Greater than "@" means alpha characters (specifically not starting with "#" or "?")
2301             
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2302                 
if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
2303                     
return false;
2304                 }
2305             }
2306             
return true;
2307         },
2308
2309         
"parent": function( elem ) {
2310             
return !Expr.pseudos["empty"]( elem );
2311         },
2312
2313         
// Element/input types
2314         
"header": function( elem ) {
2315             
return rheader.test( elem.nodeName );
2316         },
2317
2318         
"input": function( elem ) {
2319             
return rinputs.test( elem.nodeName );
2320         },
2321
2322         
"button": function( elem ) {
2323             
var name = elem.nodeName.toLowerCase();
2324             
return name === "input" && elem.type === "button" || name === "button";
2325         },
2326
2327         
"text": function( elem ) {
2328             
var attr;
2329             
// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
2330             
// use getAttribute instead to test this case
2331             
return elem.nodeName.toLowerCase() === "input" &&
2332                 elem.type ===
"text" &&
2333                 ( (attr = elem.getAttribute(
"type")) == null || attr.toLowerCase() === elem.type );
2334         },
2335
2336         
// Position-in-collection
2337         
"first": createPositionalPseudo(function() {
2338             
return [ 0 ];
2339         }),
2340
2341         
"last": createPositionalPseudo(function( matchIndexes, length ) {
2342             
return [ length - 1 ];
2343         }),
2344
2345         
"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2346             
return [ argument < 0 ? argument + length : argument ];
2347         }),
2348
2349         
"even": createPositionalPseudo(function( matchIndexes, length ) {
2350             
var i = 0;
2351             
for ( ; i < length; i += 2 ) {
2352                 matchIndexes.push( i );
2353             }
2354             
return matchIndexes;
2355         }),
2356
2357         
"odd": createPositionalPseudo(function( matchIndexes, length ) {
2358             
var i = 1;
2359             
for ( ; i < length; i += 2 ) {
2360                 matchIndexes.push( i );
2361             }
2362             
return matchIndexes;
2363         }),
2364
2365         
"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2366             
var i = argument < 0 ? argument + length : argument;
2367             
for ( ; --i >= 0; ) {
2368                 matchIndexes.push( i );
2369             }
2370             
return matchIndexes;
2371         }),
2372
2373         
"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2374             
var i = argument < 0 ? argument + length : argument;
2375             
for ( ; ++i < length; ) {
2376                 matchIndexes.push( i );
2377             }
2378             
return matchIndexes;
2379         })
2380     }
2381 };
2382
2383 Expr.pseudos[
"nth"] = Expr.pseudos["eq"];
2384
2385 // Add button/input type pseudos

2386 for
( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2387     Expr.pseudos[ i ] = createInputPseudo( i );
2388 }

2389 for
( i in { submit: true, reset: true } ) {
2390     Expr.pseudos[ i ] = createButtonPseudo( i );
2391 }

2392
2393 // Easy API
for creating new setFilters
2394 function setFilters() {}
2395 setFilters.prototype = Expr.filters = Expr.pseudos;
2396 Expr.setFilters =
new setFilters();
2397
2398 function tokenize( selector, parseOnly ) {
2399     
var matched, match, tokens, type,
2400         soFar, groups, preFilters,
2401         cached = tokenCache[ selector +
" " ];
2402
2403     
if ( cached ) {
2404         
return parseOnly ? 0 : cached.slice( 0 );
2405     }
2406
2407     soFar = selector;
2408     groups = [];
2409     preFilters = Expr.preFilter;
2410
2411     
while ( soFar ) {
2412
2413         
// Comma and first run
2414         
if ( !matched || (match = rcomma.exec( soFar )) ) {
2415             
if ( match ) {
2416                 
// Don't consume trailing commas as valid
2417                 soFar = soFar.slice( match[
0].length ) || soFar;
2418             }
2419             groups.push( tokens = [] );
2420         }
2421
2422         matched =
false;
2423
2424         
// Combinators
2425         
if ( (match = rcombinators.exec( soFar )) ) {
2426             matched = match.shift();
2427             tokens.push({
2428                 
value: matched,
2429                 
// Cast descendant combinators to space
2430                 type: match[
0].replace( rtrim, " " )
2431             });
2432             soFar = soFar.slice( matched.length );
2433         }
2434
2435         
// Filters
2436         
for ( type in Expr.filter ) {
2437             
if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2438                 (match = preFilters[ type ]( match ))) ) {
2439                 matched = match.shift();
2440                 tokens.push({
2441                     
value: matched,
2442                     type: type,
2443                     matches: match
2444                 });
2445                 soFar = soFar.slice( matched.length );
2446             }
2447         }
2448
2449         
if ( !matched ) {
2450             
break;
2451         }
2452     }
2453
2454     
// Return the length of the invalid excess
2455     
// if we're just parsing
2456     
// Otherwise, throw an error or return tokens
2457     
return parseOnly ?
2458         soFar.length :
2459         soFar ?
2460             Sizzle.error( selector ) :
2461             
// Cache the tokens
2462             tokenCache( selector, groups ).slice(
0 );
2463 }
2464
2465 function toSelector( tokens ) {
2466     
var i = 0,
2467         len = tokens.length,
2468         selector =
"";
2469     
for ( ; i < len; i++ ) {
2470         selector += tokens[i].
value;
2471     }
2472     
return selector;
2473 }
2474
2475 function addCombinator( matcher, combinator,
base ) {
2476     
var dir = combinator.dir,
2477         checkNonElements =
base && dir === "parentNode",
2478         doneName = done++;
2479
2480     
return combinator.first ?
2481         
// Check against closest ancestor/preceding element
2482         function( elem, context, xml ) {
2483             
while ( (elem = elem[ dir ]) ) {
2484                 
if ( elem.nodeType === 1 || checkNonElements ) {
2485                     
return matcher( elem, context, xml );
2486                 }
2487             }
2488         } :
2489
2490         
// Check against all ancestor/preceding elements
2491         function( elem, context, xml ) {
2492             
var data, cache, outerCache,
2493                 dirkey = dirruns +
" " + doneName;
2494
2495             
// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
2496             
if ( xml ) {
2497                 
while ( (elem = elem[ dir ]) ) {
2498                     
if ( elem.nodeType === 1 || checkNonElements ) {
2499                         
if ( matcher( elem, context, xml ) ) {
2500                             
return true;
2501                         }
2502                     }
2503                 }
2504             }
else {
2505                 
while ( (elem = elem[ dir ]) ) {
2506                     
if ( elem.nodeType === 1 || checkNonElements ) {
2507                         outerCache = elem[ expando ] || (elem[ expando ] = {});
2508                         
if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
2509                             
if ( (data = cache[1]) === true || data === cachedruns ) {
2510                                 
return data === true;
2511                             }
2512                         }
else {
2513                             cache = outerCache[ dir ] = [ dirkey ];
2514                             cache[
1] = matcher( elem, context, xml ) || cachedruns;
2515                             
if ( cache[1] === true ) {
2516                                 
return true;
2517                             }
2518                         }
2519                     }
2520                 }
2521             }
2522         };
2523 }
2524
2525 function elementMatcher( matchers ) {
2526     
return matchers.length > 1 ?
2527         function( elem, context, xml ) {
2528             
var i = matchers.length;
2529             
while ( i-- ) {
2530                 
if ( !matchers[i]( elem, context, xml ) ) {
2531                     
return false;
2532                 }
2533             }
2534             
return true;
2535         } :
2536         matchers[
0];
2537 }
2538
2539 function condense( unmatched, map, filter, context, xml ) {
2540     
var elem,
2541         newUnmatched = [],
2542         i =
0,
2543         len = unmatched.length,
2544         mapped = map !=
null;
2545
2546     
for ( ; i < len; i++ ) {
2547         
if ( (elem = unmatched[i]) ) {
2548             
if ( !filter || filter( elem, context, xml ) ) {
2549                 newUnmatched.push( elem );
2550                 
if ( mapped ) {
2551                     map.push( i );
2552                 }
2553             }
2554         }
2555     }
2556
2557     
return newUnmatched;
2558 }
2559
2560 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2561     
if ( postFilter && !postFilter[ expando ] ) {
2562         postFilter = setMatcher( postFilter );
2563     }
2564     
if ( postFinder && !postFinder[ expando ] ) {
2565         postFinder = setMatcher( postFinder, postSelector );
2566     }
2567     
return markFunction(function( seed, results, context, xml ) {
2568         
var temp, i, elem,
2569             preMap = [],
2570             postMap = [],
2571             preexisting = results.length,
2572
2573             
// Get initial elements from seed or context
2574             elems = seed || multipleContexts( selector ||
"*", context.nodeType ? [ context ] : context, [] ),
2575
2576             
// Prefilter to get matcher input, preserving a map for seed-results synchronization
2577             matcherIn = preFilter && ( seed || !selector ) ?
2578                 condense( elems, preMap, preFilter, context, xml ) :
2579                 elems,
2580
2581             matcherOut = matcher ?
2582                 
// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2583                 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2584
2585                     
// ...intermediate processing is necessary
2586                     [] :
2587
2588                     
// ...otherwise use results directly
2589                     results :
2590                 matcherIn;
2591
2592         
// Find primary matches
2593         
if ( matcher ) {
2594             matcher( matcherIn, matcherOut, context, xml );
2595         }
2596
2597         
// Apply postFilter
2598         
if ( postFilter ) {
2599             temp = condense( matcherOut, postMap );
2600             postFilter( temp, [], context, xml );
2601
2602             
// Un-match failing elements by moving them back to matcherIn
2603             i = temp.length;
2604             
while ( i-- ) {
2605                 
if ( (elem = temp[i]) ) {
2606                     matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2607                 }
2608             }
2609         }
2610
2611         
if ( seed ) {
2612             
if ( postFinder || preFilter ) {
2613                 
if ( postFinder ) {
2614                     
// Get the final matcherOut by condensing this intermediate into postFinder contexts
2615                     temp = [];
2616                     i = matcherOut.length;
2617                     
while ( i-- ) {
2618                         
if ( (elem = matcherOut[i]) ) {
2619                             
// Restore matcherIn since elem is not yet a final match
2620                             temp.push( (matcherIn[i] = elem) );
2621                         }
2622                     }
2623                     postFinder(
null, (matcherOut = []), temp, xml );
2624                 }
2625
2626                 
// Move matched elements from seed to results to keep them synchronized
2627                 i = matcherOut.length;
2628                 
while ( i-- ) {
2629                     
if ( (elem = matcherOut[i]) &&
2630                         (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -
1 ) {
2631
2632                         seed[temp] = !(results[temp] = elem);
2633                     }
2634                 }
2635             }
2636
2637         
// Add elements to results, through postFinder if defined
2638         }
else {
2639             matcherOut = condense(
2640                 matcherOut === results ?
2641                     matcherOut.splice( preexisting, matcherOut.length ) :
2642                     matcherOut
2643             );
2644             
if ( postFinder ) {
2645                 postFinder(
null, results, matcherOut, xml );
2646             }
else {
2647                 push.apply( results, matcherOut );
2648             }
2649         }
2650     });
2651 }
2652
2653 function matcherFromTokens( tokens ) {
2654     
var checkContext, matcher, j,
2655         len = tokens.length,
2656         leadingRelative = Expr.relative[ tokens[
0].type ],
2657         implicitRelative = leadingRelative || Expr.relative[
" "],
2658         i = leadingRelative ?
1 : 0,
2659
2660         
// The foundational matcher ensures that elements are reachable from top-level context(s)
2661         matchContext = addCombinator( function( elem ) {
2662             
return elem === checkContext;
2663         }, implicitRelative,
true ),
2664         matchAnyContext = addCombinator( function( elem ) {
2665             
return indexOf.call( checkContext, elem ) > -1;
2666         }, implicitRelative,
true ),
2667         matchers = [ function( elem, context, xml ) {
2668             
return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2669                 (checkContext = context).nodeType ?
2670                     matchContext( elem, context, xml ) :
2671                     matchAnyContext( elem, context, xml ) );
2672         } ];
2673
2674     
for ( ; i < len; i++ ) {
2675         
if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2676             matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2677         }
else {
2678             matcher = Expr.filter[ tokens[i].type ].apply(
null, tokens[i].matches );
2679
2680             
// Return special upon seeing a positional matcher
2681             
if ( matcher[ expando ] ) {
2682                 
// Find the next relative operator (if any) for proper handling
2683                 j = ++i;
2684                 
for ( ; j < len; j++ ) {
2685                     
if ( Expr.relative[ tokens[j].type ] ) {
2686                         
break;
2687                     }
2688                 }
2689                 
return setMatcher(
2690                     i >
1 && elementMatcher( matchers ),
2691                     i >
1 && toSelector(
2692                         
// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2693                         tokens.slice(
0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2694                     ).replace( rtrim,
"$1" ),
2695                     matcher,
2696                     i < j && matcherFromTokens( tokens.slice( i, j ) ),
2697                     j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2698                     j < len && toSelector( tokens )
2699                 );
2700             }
2701             matchers.push( matcher );
2702         }
2703     }
2704
2705     
return elementMatcher( matchers );
2706 }
2707
2708 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2709     
// A counter to specify which element is currently being matched
2710     
var matcherCachedRuns = 0,
2711         bySet = setMatchers.length >
0,
2712         byElement = elementMatchers.length >
0,
2713         superMatcher = function( seed, context, xml, results, expandContext ) {
2714             
var elem, j, matcher,
2715                 setMatched = [],
2716                 matchedCount =
0,
2717                 i =
"0",
2718                 unmatched = seed && [],
2719                 outermost = expandContext !=
null,
2720                 contextBackup = outermostContext,
2721                 
// We must always have either seed elements or context
2722                 elems = seed || byElement && Expr.find[
"TAG"]( "*", expandContext && context.parentNode || context ),
2723                 
// Use integer dirruns iff this is the outermost matcher
2724                 dirrunsUnique = (dirruns += contextBackup ==
null ? 1 : Math.random() || 0.1);
2725
2726             
if ( outermost ) {
2727                 outermostContext = context !== document && context;
2728                 cachedruns = matcherCachedRuns;
2729             }
2730
2731             
// Add elements passing elementMatchers directly to results
2732             
// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
2733             
for ( ; (elem = elems[i]) != null; i++ ) {
2734                 
if ( byElement && elem ) {
2735                     j =
0;
2736                     
while ( (matcher = elementMatchers[j++]) ) {
2737                         
if ( matcher( elem, context, xml ) ) {
2738                             results.push( elem );
2739                             
break;
2740                         }
2741                     }
2742                     
if ( outermost ) {
2743                         dirruns = dirrunsUnique;
2744                         cachedruns = ++matcherCachedRuns;
2745                     }
2746                 }
2747
2748                 
// Track unmatched elements for set filters
2749                 
if ( bySet ) {
2750                     
// They will have gone through all possible matchers
2751                     
if ( (elem = !matcher && elem) ) {
2752                         matchedCount--;
2753                     }
2754
2755                     
// Lengthen the array for every element, matched or not
2756                     
if ( seed ) {
2757                         unmatched.push( elem );
2758                     }
2759                 }
2760             }
2761
2762             
// Apply set filters to unmatched elements
2763             matchedCount += i;
2764             
if ( bySet && i !== matchedCount ) {
2765                 j =
0;
2766                 
while ( (matcher = setMatchers[j++]) ) {
2767                     matcher( unmatched, setMatched, context, xml );
2768                 }
2769
2770                 
if ( seed ) {
2771                     
// Reintegrate element matches to eliminate the need for sorting
2772                     
if ( matchedCount > 0 ) {
2773                         
while ( i-- ) {
2774                             
if ( !(unmatched[i] || setMatched[i]) ) {
2775                                 setMatched[i] = pop.call( results );
2776                             }
2777                         }
2778                     }
2779
2780                     
// Discard index placeholder values to get only actual matches
2781                     setMatched = condense( setMatched );
2782                 }
2783
2784                 
// Add matches to results
2785                 push.apply( results, setMatched );
2786
2787                 
// Seedless set matches succeeding multiple successful matchers stipulate sorting
2788                 
if ( outermost && !seed && setMatched.length > 0 &&
2789                     ( matchedCount + setMatchers.length ) >
1 ) {
2790
2791                     Sizzle.uniqueSort( results );
2792                 }
2793             }
2794
2795             
// Override manipulation of globals by nested matchers
2796             
if ( outermost ) {
2797                 dirruns = dirrunsUnique;
2798                 outermostContext = contextBackup;
2799             }
2800
2801             
return unmatched;
2802         };
2803
2804     
return bySet ?
2805         markFunction( superMatcher ) :
2806         superMatcher;
2807 }
2808
2809 compile = Sizzle.compile = function( selector,
group /* Internal Use Only */ ) {
2810     
var i,
2811         setMatchers = [],
2812         elementMatchers = [],
2813         cached = compilerCache[ selector +
" " ];
2814
2815     
if ( !cached ) {
2816         
// Generate a function of recursive functions that can be used to check each element
2817         
if ( !group ) {
2818             
group = tokenize( selector );
2819         }
2820         i =
group.length;
2821         
while ( i-- ) {
2822             cached = matcherFromTokens(
group[i] );
2823             
if ( cached[ expando ] ) {
2824                 setMatchers.push( cached );
2825             }
else {
2826                 elementMatchers.push( cached );
2827             }
2828         }
2829
2830         
// Cache the compiled function
2831         cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2832     }
2833     
return cached;
2834 };
2835
2836 function multipleContexts( selector, contexts, results ) {
2837     
var i = 0,
2838         len = contexts.length;
2839     
for ( ; i < len; i++ ) {
2840         Sizzle( selector, contexts[i], results );
2841     }
2842     
return results;
2843 }
2844
2845 function
select( selector, context, results, seed ) {
2846     
var i, tokens, token, type, find,
2847         match = tokenize( selector );
2848
2849     
if ( !seed ) {
2850         
// Try to minimize operations if there is only one group
2851         
if ( match.length === 1 ) {
2852
2853             
// Take a shortcut and set the context if the root selector is an ID
2854             tokens = match[
0] = match[0].slice( 0 );
2855             
if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2856                     support.getById && context.nodeType ===
9 && documentIsHTML &&
2857                     Expr.relative[ tokens[
1].type ] ) {
2858
2859                 context = ( Expr.find[
"ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2860                 
if ( !context ) {
2861                     
return results;
2862                 }
2863                 selector = selector.slice( tokens.shift().
value.length );
2864             }
2865
2866             
// Fetch a seed set for right-to-left matching
2867             i = matchExpr[
"needsContext"].test( selector ) ? 0 : tokens.length;
2868             
while ( i-- ) {
2869                 token = tokens[i];
2870
2871                 
// Abort if we hit a combinator
2872                 
if ( Expr.relative[ (type = token.type) ] ) {
2873                     
break;
2874                 }
2875                 
if ( (find = Expr.find[ type ]) ) {
2876                     
// Search, expanding context for leading sibling combinators
2877                     
if ( (seed = find(
2878                         token.matches[
0].replace( runescape, funescape ),
2879                         rsibling.test( tokens[
0].type ) && context.parentNode || context
2880                     )) ) {
2881
2882                         
// If seed is empty or no tokens remain, we can return early
2883                         tokens.splice( i,
1 );
2884                         selector = seed.length && toSelector( tokens );
2885                         
if ( !selector ) {
2886                             push.apply( results, seed );
2887                             
return results;
2888                         }
2889
2890                         
break;
2891                     }
2892                 }
2893             }
2894         }
2895     }
2896
2897     
// Compile and execute a filtering function
2898     
// Provide `match` to avoid retokenization if we modified the selector above
2899     compile( selector, match )(
2900         seed,
2901         context,
2902         !documentIsHTML,
2903         results,
2904         rsibling.test( selector )
2905     );
2906     
return results;
2907 }

2908
2909 // One-time assignments
2910
2911 // Sort stability

2912 support.sortStable = expando.split(
"").sort( sortOrder ).join("") === expando;
2913
2914 // Support: Chrome<
14
2915 // Always assume duplicates
if they aren't passed to the comparison function
2916 support.detectDuplicates = hasDuplicate;

2917
2918 // Initialize against the
default document
2919 setDocument();

2920
2921 // Support: Webkit<
537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2922 // Detached nodes confoundingly follow *each other*

2923 support.sortDetached = assert(function( div1 ) {
2924     
// Should return 1, but returns 4 (following)
2925     
return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2926 });

2927
2928 // Support: IE<
8
2929 // Prevent attribute/property
"interpolation"
2930 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.
85%29.aspx
2931 if
( !assert(function( div ) {
2932     div.innerHTML =
"<a href='#'></a>";
2933     
return div.firstChild.getAttribute("href") === "#" ;
2934 }) ) {
2935     addHandle(
"type|href|height|width", function( elem, name, isXML ) {
2936         
if ( !isXML ) {
2937             
return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2938         }
2939     });
2940 }

2941
2942 // Support: IE<
9
2943 // Use defaultValue
in place of getAttribute("value")
2944 if
( !support.attributes || !assert(function( div ) {
2945     div.innerHTML =
"<input/>";
2946     div.firstChild.setAttribute(
"value", "" );
2947     
return div.firstChild.getAttribute( "value" ) === "";
2948 }) ) {
2949     addHandle(
"value", function( elem, name, isXML ) {
2950         
if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2951             
return elem.defaultValue;
2952         }
2953     });
2954 }

2955
2956 // Support: IE<
9
2957 // Use getAttributeNode to fetch booleans
when getAttribute lies
2958 if
( !assert(function( div ) {
2959     
return div.getAttribute("disabled") == null;
2960 }) ) {
2961     addHandle( booleans, function( elem, name, isXML ) {
2962         
var val;
2963         
if ( !isXML ) {
2964             
return (val = elem.getAttributeNode( name )) && val.specified ?
2965                 val.
value :
2966                 elem[ name ] ===
true ? name.toLowerCase() : null;
2967         }
2968     });
2969 }
2970
2971 jQuery.find = Sizzle;
2972 jQuery.expr = Sizzle.selectors;
2973 jQuery.expr[
":"] = jQuery.expr.pseudos;
2974 jQuery.unique = Sizzle.uniqueSort;
2975 jQuery.text = Sizzle.getText;
2976 jQuery.isXMLDoc = Sizzle.isXML;
2977 jQuery.contains = Sizzle.contains;
2978
2979
2980 })( window );

2981 // String to Object options format cache

2982 var
optionsCache = {};
2983
2984 // Convert String-formatted options
into Object-formatted ones and store in cache
2985 function createOptions( options ) {
2986     
var object = optionsCache[ options ] = {};
2987     jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
2988         
object[ flag ] = true;
2989     });
2990     
return object;
2991 }

2992
2993 /*
2994  * Create a callback list
using the following parameters:
2995  *
2996  * options: an optional list of space-separated options that will change how
2997  * the callback list behaves or a more traditional option
object
2998  *
2999  * By
default a callback list will act like an event callback list and can be
3000  *
"fired" multiple times.
3001  *
3002  * Possible options:
3003  *
3004  * once: will ensure the callback list can only be fired once (like a Deferred)
3005  *
3006  * memory: will keep track of previous values and will call any callback added
3007  * after the list has been fired right away with the latest
"memorized"
3008  * values (like a Deferred)
3009  *
3010  * unique: will ensure a callback can only be added once (no duplicate
in the list)
3011  *
3012  * stopOnFalse: interrupt callings
when a callback returns false
3013  *
3014  */

3015 jQuery.Callbacks = function( options ) {
3016
3017     
// Convert options from String-formatted to Object-formatted if needed
3018     
// (we check in cache first)
3019     options =
typeof options === "string" ?
3020         ( optionsCache[ options ] || createOptions( options ) ) :
3021         jQuery.extend( {}, options );
3022
3023     
var // Flag to know if list is currently firing
3024         firing,
3025         
// Last fire value (for non-forgettable lists)
3026         memory,
3027         
// Flag to know if list was already fired
3028         fired,
3029         
// End of the loop when firing
3030         firingLength,
3031         
// Index of currently firing callback (modified by remove if needed)
3032         firingIndex,
3033         
// First callback to fire (used internally by add and fireWith)
3034         firingStart,
3035         
// Actual callback list
3036         list = [],
3037         
// Stack of fire calls for repeatable lists
3038         stack = !options.once && [],
3039         
// Fire callbacks
3040         fire = function( data ) {
3041             memory = options.memory && data;
3042             fired =
true;
3043             firingIndex = firingStart ||
0;
3044             firingStart =
0;
3045             firingLength = list.length;
3046             firing =
true;
3047             
for ( ; list && firingIndex < firingLength; firingIndex++ ) {
3048                 
if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
3049                     memory =
false; // To prevent further calls using add
3050                     
break;
3051                 }
3052             }
3053             firing =
false;
3054             
if ( list ) {
3055                 
if ( stack ) {
3056                     
if ( stack.length ) {
3057                         fire( stack.shift() );
3058                     }
3059                 }
else if ( memory ) {
3060                     list = [];
3061                 }
else {
3062                     self.disable();
3063                 }
3064             }
3065         },
3066         
// Actual Callbacks object
3067         self = {
3068             
// Add a callback or a collection of callbacks to the list
3069             
add: function() {
3070                 
if ( list ) {
3071                     
// First, we save the current length
3072                     
var start = list.length;
3073                     (function
add( args ) {
3074                         jQuery.each( args, function( _, arg ) {
3075                             
var type = jQuery.type( arg );
3076                             
if ( type === "function" ) {
3077                                 
if ( !options.unique || !self.has( arg ) ) {
3078                                     list.push( arg );
3079                                 }
3080                             }
else if ( arg && arg.length && type !== "string" ) {
3081                                 
// Inspect recursively
3082                                 
add( arg );
3083                             }
3084                         });
3085                     })( arguments );
3086                     
// Do we need to add the callbacks to the
3087                     
// current firing batch?
3088                     
if ( firing ) {
3089                         firingLength = list.length;
3090                     
// With memory, if we're not firing then
3091                     
// we should call right away
3092                     }
else if ( memory ) {
3093                         firingStart = start;
3094                         fire( memory );
3095                     }
3096                 }
3097                 
return this;
3098             },
3099             
// Remove a callback from the list
3100             
remove: function() {
3101                 
if ( list ) {
3102                     jQuery.each( arguments, function( _, arg ) {
3103                         
var index;
3104                         
while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3105                             list.splice( index,
1 );
3106                             
// Handle firing indexes
3107                             
if ( firing ) {
3108                                 
if ( index <= firingLength ) {
3109                                     firingLength--;
3110                                 }
3111                                 
if ( index <= firingIndex ) {
3112                                     firingIndex--;
3113                                 }
3114                             }
3115                         }
3116                     });
3117                 }
3118                 
return this;
3119             },
3120             
// Check if a given callback is in the list.
3121             
// If no argument is given, return whether or not list has callbacks attached.
3122             has: function( fn ) {
3123                 
return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
3124             },
3125             
// Remove all callbacks from the list
3126             empty: function() {
3127                 list = [];
3128                 firingLength =
0;
3129                 
return this;
3130             },
3131             
// Have the list do nothing anymore
3132             disable: function() {
3133                 list = stack = memory = undefined;
3134                 
return this;
3135             },
3136             
// Is it disabled?
3137             disabled: function() {
3138                 
return !list;
3139             },
3140             
// Lock the list in its current state
3141             
lock: function() {
3142                 stack = undefined;
3143                 
if ( !memory ) {
3144                     self.disable();
3145                 }
3146                 
return this;
3147             },
3148             
// Is it locked?
3149             locked: function() {
3150                 
return !stack;
3151             },
3152             
// Call all callbacks with the given context and arguments
3153             fireWith: function( context, args ) {
3154                 
if ( list && ( !fired || stack ) ) {
3155                     args = args || [];
3156                     args = [ context, args.slice ? args.slice() : args ];
3157                     
if ( firing ) {
3158                         stack.push( args );
3159                     }
else {
3160                         fire( args );
3161                     }
3162                 }
3163                 
return this;
3164             },
3165             
// Call all the callbacks with the given arguments
3166             fire: function() {
3167                 self.fireWith(
this, arguments );
3168                 
return this;
3169             },
3170             
// To know if the callbacks have already been called at least once
3171             fired: function() {
3172                 
return !!fired;
3173             }
3174         };
3175
3176     
return self;
3177 };
3178 jQuery.extend({
3179
3180     Deferred: function( func ) {
3181         
var tuples = [
3182                 
// action, add listener, listener list, final state
3183                 [
"resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
3184                 [
"reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
3185                 
[ "notify", "progress", jQuery.Callbacks("memory") ]
3186             ],
3187             state =
"pending",
3188             promise = {
3189                 state: function() {
3190                     
return state;
3191                 },
3192                 always: function() {
3193                     deferred.done( arguments ).fail( arguments );
3194                     
return this;
3195                 },
3196                 then: function(
/* fnDone, fnFail, fnProgress */ ) {
3197                     
var fns = arguments;
3198                     
return jQuery.Deferred(function( newDefer ) {
3199                         jQuery.each( tuples, function( i, tuple ) {
3200                             
var action = tuple[ 0 ],
3201                                 fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3202                             
// deferred[ done | fail | progress ] for forwarding actions to newDefer
3203                             deferred[ tuple[
1] ](function() {
3204                                 
var returned = fn && fn.apply( this, arguments );
3205                                 
if ( returned && jQuery.isFunction( returned.promise ) ) {
3206                                     returned.promise()
3207                                         .done( newDefer.resolve )
3208                                         .fail( newDefer.reject )
3209                                         .progress( newDefer.notify );
3210                                 }
else {
3211                                     newDefer[ action +
"With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
3212                                 }
3213                             });
3214                         });
3215                         fns =
null;
3216                     }).promise();
3217                 },
3218                 
// Get a promise for this deferred
3219                 
// If obj is provided, the promise aspect is added to the object
3220                 promise: function( obj ) {
3221                     
return obj != null ? jQuery.extend( obj, promise ) : promise;
3222                 }
3223             },
3224             deferred = {};
3225
3226         
// Keep pipe for back-compat
3227         promise.pipe = promise.then;
3228
3229         
// Add list-specific methods
3230         jQuery.each( tuples, function( i, tuple ) {
3231             
var list = tuple[ 2 ],
3232                 stateString = tuple[
3 ];
3233
3234             
// promise[ done | fail | progress ] = list.add
3235             promise[ tuple[
1] ] = list.add;
3236
3237             
// Handle state
3238             
if ( stateString ) {
3239                 list.
add(function() {
3240                     
// state = [ resolved | rejected ]
3241                     state = stateString;
3242
3243                 
// [ reject_list | resolve_list ].disable; progress_list.lock
3244                 }, tuples[ i ^
1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3245             }
3246
3247             
// deferred[ resolve | reject | notify ]
3248             deferred[ tuple[
0] ] = function() {
3249                 deferred[ tuple[
0] + "With" ]( this === deferred ? promise : this, arguments );
3250                 
return this;
3251             };
3252             deferred[ tuple[
0] + "With" ] = list.fireWith;
3253         });
3254
3255         
// Make the deferred a promise
3256         promise.promise( deferred );
3257
3258         
// Call given func if any
3259         
if ( func ) {
3260             func.call( deferred, deferred );
3261         }
3262
3263         
// All done!
3264         
return deferred;
3265     },
3266
3267     
// Deferred helper
3268     
when: function( subordinate /* , ..., subordinateN */ ) {
3269         
var i = 0,
3270             resolveValues = core_slice.call( arguments ),
3271             length = resolveValues.length,
3272
3273             
// the count of uncompleted subordinates
3274             remaining = length !==
1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3275
3276             
// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
3277             deferred = remaining ===
1 ? subordinate : jQuery.Deferred(),
3278
3279             
// Update function for both resolve and progress values
3280             updateFunc = function( i, contexts, values ) {
3281                 
return function( value ) {
3282                     contexts[ i ] =
this;
3283                     values[ i ] = arguments.length >
1 ? core_slice.call( arguments ) : value;
3284                     
if( values === progressValues ) {
3285                         deferred.notifyWith( contexts, values );
3286                     }
else if ( !( --remaining ) ) {
3287                         deferred.resolveWith( contexts, values );
3288                     }
3289                 };
3290             },
3291
3292             progressValues, progressContexts, resolveContexts;
3293
3294         
// add listeners to Deferred subordinates; treat others as resolved
3295         
if ( length > 1 ) {
3296             progressValues =
new Array( length );
3297             progressContexts =
new Array( length );
3298             resolveContexts =
new Array( length );
3299             
for ( ; i < length; i++ ) {
3300                 
if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3301                     resolveValues[ i ].promise()
3302                         .done( updateFunc( i, resolveContexts, resolveValues ) )
3303                         .fail( deferred.reject )
3304                         .progress( updateFunc( i, progressContexts, progressValues ) );
3305                 }
else {
3306                     --remaining;
3307                 }
3308             }
3309         }
3310
3311         
// if we're not waiting on anything, resolve the master
3312         
if ( !remaining ) {
3313             deferred.resolveWith( resolveContexts, resolveValues );
3314         }
3315
3316         
return deferred.promise();
3317     }
3318 });
3319 jQuery.support = (function( support ) {
3320
3321     
var all, a, input, select, fragment, opt, eventName, isSupported, i,
3322         div = document.createElement(
"div");
3323
3324     
// Setup
3325     div.setAttribute(
"className", "t" );
3326     div.innerHTML =
" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
3327
3328     
// Finish early in limited (non-browser) environments
3329     all = div.getElementsByTagName(
"*") || [];
3330     a = div.getElementsByTagName(
"a")[ 0 ];
3331     
if ( !a || !a.style || !all.length ) {
3332         
return support;
3333     }
3334
3335     
// First batch of tests
3336     
select = document.createElement("select");
3337     opt =
select.appendChild( document.createElement("option") );
3338     input = div.getElementsByTagName(
"input")[ 0 ];
3339
3340     a.style.cssText =
"top:1px;float:left;opacity:.5";
3341
3342     
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
3343     support.getSetAttribute = div.className !==
"t";
3344
3345     
// IE strips leading whitespace when .innerHTML is used
3346     support.leadingWhitespace = div.firstChild.nodeType ===
3;
3347
3348     
// Make sure that tbody elements aren't automatically inserted
3349     
// IE will insert them into empty tables
3350     support.tbody = !div.getElementsByTagName(
"tbody").length;
3351
3352     
// Make sure that link elements get serialized correctly by innerHTML
3353     
// This requires a wrapper element in IE
3354     support.htmlSerialize = !!div.getElementsByTagName(
"link").length;
3355
3356     
// Get the style information from getAttribute
3357     
// (IE uses .cssText instead)
3358     support.style = /top/.test( a.getAttribute(
"style") );
3359
3360     
// Make sure that URLs aren't manipulated
3361     
// (IE normalizes it by default)
3362     support.hrefNormalized = a.getAttribute(
"href") === "/a";
3363
3364     
// Make sure that element opacity exists
3365     
// (IE uses filter instead)
3366     
// Use a regex to work around a WebKit issue. See #5145
3367     support.opacity = /^
0.5/.test( a.style.opacity );
3368
3369     
// Verify style float existence
3370     
// (IE uses styleFloat instead of cssFloat)
3371     support.cssFloat = !!a.style.cssFloat;
3372
3373     
// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
3374     support.checkOn = !!input.
value;
3375
3376     
// Make sure that a selected-by-default option has a working selected property.
3377     
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
3378     support.optSelected = opt.selected;
3379
3380     
// Tests for enctype support on a form (#6743)
3381     support.enctype = !!document.createElement(
"form").enctype;
3382
3383     
// Makes sure cloning an html5 element does not cause problems
3384     
// Where outerHTML is undefined, this still works
3385     support.html5Clone = document.createElement(
"nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
3386
3387     
// Will be defined later
3388     support.inlineBlockNeedsLayout =
false;
3389     support.shrinkWrapBlocks =
false;
3390     support.pixelPosition =
false;
3391     support.deleteExpando =
true;
3392     support.noCloneEvent =
true;
3393     support.reliableMarginRight =
true;
3394     support.boxSizingReliable =
true;
3395
3396     
// Make sure checked status is properly cloned
3397     input.
checked = true;
3398     support.noCloneChecked = input.cloneNode(
true ).checked;
3399
3400     
// Make sure that the options inside disabled selects aren't marked as disabled
3401     
// (WebKit marks them as disabled)
3402     
select.disabled = true;
3403     support.optDisabled = !opt.disabled;
3404
3405     
// Support: IE<9
3406     
try {
3407         delete div.test;
3408     }
catch( e ) {
3409         support.deleteExpando =
false;
3410     }
3411
3412     
// Check if we can trust getAttribute("value")
3413     input = document.createElement(
"input");
3414     input.setAttribute(
"value", "" );
3415     support.input = input.getAttribute(
"value" ) === "";
3416
3417     
// Check if an input maintains its value after becoming a radio
3418     input.
value = "t";
3419     input.setAttribute(
"type", "radio" );
3420     support.radioValue = input.
value === "t";
3421
3422     
// #11217 - WebKit loses check when the name is after the checked attribute
3423     input.setAttribute(
"checked", "t" );
3424     input.setAttribute(
"name", "t" );
3425
3426     fragment = document.createDocumentFragment();
3427     fragment.appendChild( input );
3428
3429     
// Check if a disconnected checkbox will retain its checked
3430     
// value of true after appended to the DOM (IE6/7)
3431     support.appendChecked = input.
checked;
3432
3433     
// WebKit doesn't clone checked state correctly in fragments
3434     support.checkClone = fragment.cloneNode(
true ).cloneNode( true ).lastChild.checked;
3435
3436     
// Support: IE<9
3437     
// Opera does not clone events (and typeof div.attachEvent === undefined).
3438     
// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
3439     
if ( div.attachEvent ) {
3440         div.attachEvent(
"onclick", function() {
3441             support.noCloneEvent =
false;
3442         });
3443
3444         div.cloneNode(
true ).click();
3445     }
3446
3447     
// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
3448     
// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
3449     
for ( i in { submit: true, change: true, focusin: true }) {
3450         div.setAttribute( eventName =
"on" + i, "t" );
3451
3452         support[ i +
"Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
3453     }
3454
3455     div.style.backgroundClip =
"content-box";
3456     div.cloneNode(
true ).style.backgroundClip = "";
3457     support.clearCloneStyle = div.style.backgroundClip ===
"content-box";
3458
3459     
// Support: IE<9
3460     
// Iteration over object's inherited properties before its own.
3461     
for ( i in jQuery( support ) ) {
3462         
break;
3463     }
3464     support.ownLast = i !==
"0";
3465
3466     
// Run tests that need a body at doc ready
3467     jQuery(function() {
3468         
var container, marginDiv, tds,
3469             divReset =
"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
3470             body = document.getElementsByTagName(
"body")[0];
3471
3472         
if ( !body ) {
3473             
// Return for frameset docs that don't have a body
3474             
return;
3475         }
3476
3477         container = document.createElement(
"div");
3478         container.style.cssText =
"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
3479
3480         body.appendChild( container ).appendChild( div );
3481
3482         
// Support: IE8
3483         
// Check if table cells still have offsetWidth/Height when they are set
3484         
// to display:none and there are still other visible table cells in a
3485         
// table row; if so, offsetWidth/Height are not reliable for use when
3486         
// determining if an element has been hidden directly using
3487         
// display:none (it is still safe to use offsets if a parent element is
3488         
// hidden; don safety goggles and see bug #4512 for more information).
3489         div.innerHTML =
"<table><tr><td></td><td>t</td></tr></table>";
3490         tds = div.getElementsByTagName(
"td");
3491         tds[
0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
3492         isSupported = ( tds[
0 ].offsetHeight === 0 );
3493
3494         tds[
0 ].style.display = "";
3495         tds[
1 ].style.display = "none";
3496
3497         
// Support: IE8
3498         
// Check if empty table cells still have offsetWidth/Height
3499         support.reliableHiddenOffsets = isSupported && ( tds[
0 ].offsetHeight === 0 );
3500
3501         
// Check box-sizing and margin behavior.
3502         div.innerHTML =
"";
3503         div.style.cssText =
"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
3504
3505         
// Workaround failing boxSizing test due to offsetWidth returning wrong value
3506         
// with some non-1 values of body zoom, ticket #13543
3507         jQuery.swap( body, body.style.zoom !=
null ? { zoom: 1 } : {}, function() {
3508             support.boxSizing = div.offsetWidth ===
4;
3509         });
3510
3511         
// Use window.getComputedStyle because jsdom on node.js will break without it.
3512         
if ( window.getComputedStyle ) {
3513             support.pixelPosition = ( window.getComputedStyle( div,
null ) || {} ).top !== "1%";
3514             support.boxSizingReliable = ( window.getComputedStyle( div,
null ) || { width: "4px" } ).width === "4px";
3515
3516             
// Check if div with explicit width and no margin-right incorrectly
3517             
// gets computed margin-right based on width of container. (#3333)
3518             
// Fails in WebKit before Feb 2011 nightlies
3519             
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
3520             marginDiv = div.appendChild( document.createElement(
"div") );
3521             marginDiv.style.cssText = div.style.cssText = divReset;
3522             marginDiv.style.marginRight = marginDiv.style.width =
"0";
3523             div.style.width =
"1px";
3524
3525             support.reliableMarginRight =
3526                 !parseFloat( ( window.getComputedStyle( marginDiv,
null ) || {} ).marginRight );
3527         }
3528
3529         
if ( typeof div.style.zoom !== core_strundefined ) {
3530             
// Support: IE<8
3531             
// Check if natively block-level elements act like inline-block
3532             
// elements when setting their display to 'inline' and giving
3533             
// them layout
3534             div.innerHTML =
"";
3535             div.style.cssText = divReset +
"width:1px;padding:1px;display:inline;zoom:1";
3536             support.inlineBlockNeedsLayout = ( div.offsetWidth ===
3 );
3537
3538             
// Support: IE6
3539             
// Check if elements with layout shrink-wrap their children
3540             div.style.display =
"block";
3541             div.innerHTML =
"<div></div>";
3542             div.firstChild.style.width =
"5px";
3543             support.shrinkWrapBlocks = ( div.offsetWidth !==
3 );
3544
3545             
if ( support.inlineBlockNeedsLayout ) {
3546                 
// Prevent IE 6 from affecting layout for positioned elements #11048
3547                 
// Prevent IE from shrinking the body in IE 7 mode #12869
3548                 
// Support: IE<8
3549                 body.style.zoom =
1;
3550             }
3551         }
3552
3553         body.removeChild( container );
3554
3555         
// Null elements to avoid leaks in IE
3556         container = div = tds = marginDiv =
null;
3557     });
3558
3559     
// Null elements to avoid leaks in IE
3560     all =
select = fragment = opt = a = input = null;
3561
3562     
return support;
3563 })({});

3564
3565 var
rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
3566     rmultiDash = /([A-Z])/g;
3567
3568 function internalData( elem, name, data, pvt
/* Internal Use Only */ ){
3569     
if ( !jQuery.acceptData( elem ) ) {
3570         
return;
3571     }
3572
3573     
var ret, thisCache,
3574         internalKey = jQuery.expando,
3575
3576         
// We have to handle DOM nodes and JS objects differently because IE6-7
3577         
// can't GC object references properly across the DOM-JS boundary
3578         isNode = elem.nodeType,
3579
3580         
// Only DOM nodes need the global jQuery cache; JS object data is
3581         
// attached directly to the object so GC can occur automatically
3582         cache = isNode ? jQuery.cache : elem,
3583
3584         
// Only defining an ID for JS objects if its cache already exists allows
3585         
// the code to shortcut on the same path as a DOM node with no cache
3586         id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
3587
3588     
// Avoid doing any more work than we need to when trying to get data on an
3589     
// object that has no data at all
3590     
if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
3591         
return;
3592     }
3593
3594     
if ( !id ) {
3595         
// Only DOM nodes need a new unique ID for each element since their data
3596         
// ends up in the global cache
3597         
if ( isNode ) {
3598             id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
3599         }
else {
3600             id = internalKey;
3601         }
3602     }
3603
3604     
if ( !cache[ id ] ) {
3605         
// Avoid exposing jQuery metadata on plain JS objects when the object
3606         
// is serialized using JSON.stringify
3607         cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
3608     }
3609
3610     
// An object can be passed to jQuery.data instead of a key/value pair; this gets
3611     
// shallow copied over onto the existing cache
3612     
if ( typeof name === "object" || typeof name === "function" ) {
3613         
if ( pvt ) {
3614             cache[ id ] = jQuery.extend( cache[ id ], name );
3615         }
else {
3616             cache[ id ].data = jQuery.extend( cache[ id ].data, name );
3617         }
3618     }
3619
3620     thisCache = cache[ id ];
3621
3622     
// jQuery data() is stored in a separate object inside the object's internal data
3623     
// cache in order to avoid key collisions between internal data and user-defined
3624     
// data.
3625     
if ( !pvt ) {
3626         
if ( !thisCache.data ) {
3627             thisCache.data = {};
3628         }
3629
3630         thisCache = thisCache.data;
3631     }
3632
3633     
if ( data !== undefined ) {
3634         thisCache[ jQuery.camelCase( name ) ] = data;
3635     }
3636
3637     
// Check for both converted-to-camel and non-converted data property names
3638     
// If a data property was specified
3639     
if ( typeof name === "string" ) {
3640
3641         
// First Try to find as-is property data
3642         ret = thisCache[ name ];
3643
3644         
// Test for null|undefined property data
3645         
if ( ret == null ) {
3646
3647             
// Try to find the camelCased property
3648             ret = thisCache[ jQuery.camelCase( name ) ];
3649         }
3650     }
else {
3651         ret = thisCache;
3652     }
3653
3654     
return ret;
3655 }
3656
3657 function internalRemoveData( elem, name, pvt ) {
3658     
if ( !jQuery.acceptData( elem ) ) {
3659         
return;
3660     }
3661
3662     
var thisCache, i,
3663         isNode = elem.nodeType,
3664
3665         
// See jQuery.data for more information
3666         cache = isNode ? jQuery.cache : elem,
3667         id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
3668
3669     
// If there is already no cache entry for this object, there is no
3670     
// purpose in continuing
3671     
if ( !cache[ id ] ) {
3672         
return;
3673     }
3674
3675     
if ( name ) {
3676
3677         thisCache = pvt ? cache[ id ] : cache[ id ].data;
3678
3679         
if ( thisCache ) {
3680
3681             
// Support array or space separated string names for data keys
3682             
if ( !jQuery.isArray( name ) ) {
3683
3684                 
// try the string as a key before any manipulation
3685                 
if ( name in thisCache ) {
3686                     name = [ name ];
3687                 }
else {
3688
3689                     
// split the camel cased version by spaces unless a key with the spaces exists
3690                     name = jQuery.camelCase( name );
3691                     
if ( name in thisCache ) {
3692                         name = [ name ];
3693                     }
else {
3694                         name = name.split(
" ");
3695                     }
3696                 }
3697             }
else {
3698                 
// If "name" is an array of keys...
3699                 
// When data is initially created, via ("key", "val") signature,
3700                 
// keys will be converted to camelCase.
3701                 
// Since there is no way to tell _how_ a key was added, remove
3702                 
// both plain key and camelCase key. #12786
3703                 
// This will only penalize the array argument path.
3704                 name = name.concat( jQuery.map( name, jQuery.camelCase ) );
3705             }
3706
3707             i = name.length;
3708             
while ( i-- ) {
3709                 delete thisCache[ name[i] ];
3710             }
3711
3712             
// If there is no data left in the cache, we want to continue
3713             
// and let the cache object itself get destroyed
3714             
if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
3715                 
return;
3716             }
3717         }
3718     }
3719
3720     
// See jQuery.data for more information
3721     
if ( !pvt ) {
3722         delete cache[ id ].data;
3723
3724         
// Don't destroy the parent cache unless the internal data object
3725         
// had been the only thing left in it
3726         
if ( !isEmptyDataObject( cache[ id ] ) ) {
3727             
return;
3728         }
3729     }
3730
3731     
// Destroy the cache
3732     
if ( isNode ) {
3733         jQuery.cleanData( [ elem ],
true );
3734
3735     
// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
3736     
/* jshint eqeqeq: false */
3737     }
else if ( jQuery.support.deleteExpando || cache != cache.window ) {
3738         
/* jshint eqeqeq: true */
3739         delete cache[ id ];
3740
3741     
// When all else fails, null
3742     }
else {
3743         cache[ id ] =
null;
3744     }
3745 }
3746
3747 jQuery.extend({
3748     cache: {},
3749
3750     
// The following elements throw uncatchable exceptions if you
3751     
// attempt to add expando properties to them.
3752     noData: {
3753         
"applet": true,
3754         
"embed": true,
3755         
// Ban all objects except for Flash (which handle expandos)
3756         
"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
3757     },
3758
3759     hasData: function( elem ) {
3760         elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
3761         
return !!elem && !isEmptyDataObject( elem );
3762     },
3763
3764     data: function( elem, name, data ) {
3765         
return internalData( elem, name, data );
3766     },
3767
3768     removeData: function( elem, name ) {
3769         
return internalRemoveData( elem, name );
3770     },
3771
3772     
// For internal use only.
3773     _data: function( elem, name, data ) {
3774         
return internalData( elem, name, data, true );
3775     },
3776
3777     _removeData: function( elem, name ) {
3778         
return internalRemoveData( elem, name, true );
3779     },
3780
3781     
// A method for determining if a DOM node can handle the data expando
3782     acceptData: function( elem ) {
3783         
// Do not set data on non-element because it will not be cleared (#8335).
3784         
if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
3785             
return false;
3786         }
3787
3788         
var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
3789
3790         
// nodes accept data unless otherwise specified; rejection can be conditional
3791         
return !noData || noData !== true && elem.getAttribute("classid") === noData;
3792     }
3793 });
3794
3795 jQuery.fn.extend({
3796     data: function( key,
value ) {
3797         
var attrs, name,
3798             data =
null,
3799             i =
0,
3800             elem =
this[0];
3801
3802         
// Special expections of .data basically thwart jQuery.access,
3803         
// so implement the relevant behavior ourselves
3804
3805         
// Gets all values
3806         
if ( key === undefined ) {
3807             
if ( this.length ) {
3808                 data = jQuery.data( elem );
3809
3810                 
if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
3811                     attrs = elem.attributes;
3812                     
for ( ; i < attrs.length; i++ ) {
3813                         name = attrs[i].name;
3814
3815                         
if ( name.indexOf("data-") === 0 ) {
3816                             name = jQuery.camelCase( name.slice(
5) );
3817
3818                             dataAttr( elem, name, data[ name ] );
3819                         }
3820                     }
3821                     jQuery._data( elem,
"parsedAttrs", true );
3822                 }
3823             }
3824
3825             
return data;
3826         }
3827
3828         
// Sets multiple values
3829         
if ( typeof key === "object" ) {
3830             
return this.each(function() {
3831                 jQuery.data(
this, key );
3832             });
3833         }
3834
3835         
return arguments.length > 1 ?
3836
3837             
// Sets one value
3838             
this.each(function() {
3839                 jQuery.data(
this, key, value );
3840             }) :
3841
3842             
// Gets one value
3843             
// Try to fetch any internally stored data first
3844             elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) :
null;
3845     },
3846
3847     removeData: function( key ) {
3848         
return this.each(function() {
3849             jQuery.removeData(
this, key );
3850         });
3851     }
3852 });
3853
3854 function dataAttr( elem, key, data ) {
3855     
// If nothing was found internally, try to fetch any
3856     
// data from the HTML5 data-* attribute
3857     
if ( data === undefined && elem.nodeType === 1 ) {
3858
3859         
var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3860
3861         data = elem.getAttribute( name );
3862
3863         
if ( typeof data === "string" ) {
3864             
try {
3865                 data = data ===
"true" ? true :
3866                     data ===
"false" ? false :
3867                     data ===
"null" ? null :
3868                     
// Only convert to a number if it doesn't change the string
3869                     +data +
"" === data ? +data :
3870                     rbrace.test( data ) ? jQuery.parseJSON( data ) :
3871                         data;
3872             }
catch( e ) {}
3873
3874             
// Make sure we set the data so it isn't changed later
3875             jQuery.data( elem, key, data );
3876
3877         }
else {
3878             data = undefined;
3879         }
3880     }
3881
3882     
return data;
3883 }

3884
3885 // checks a cache
object for emptiness
3886 function isEmptyDataObject( obj ) {
3887     
var name;
3888     
for ( name in obj ) {
3889
3890         
// if the public data object is empty, the private is still empty
3891         
if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
3892             
continue;
3893         }
3894         
if ( name !== "toJSON" ) {
3895             
return false;
3896         }
3897     }
3898
3899     
return true;
3900 }
3901 jQuery.extend({
3902     queue: function( elem, type, data ) {
3903         
var queue;
3904
3905         
if ( elem ) {
3906             type = ( type ||
"fx" ) + "queue";
3907             queue = jQuery._data( elem, type );
3908
3909             
// Speed up dequeue by getting out quickly if this is just a lookup
3910             
if ( data ) {
3911                 
if ( !queue || jQuery.isArray(data) ) {
3912                     queue = jQuery._data( elem, type, jQuery.makeArray(data) );
3913                 }
else {
3914                     queue.push( data );
3915                 }
3916             }
3917             
return queue || [];
3918         }
3919     },
3920
3921     dequeue: function( elem, type ) {
3922         type = type ||
"fx";
3923
3924         
var queue = jQuery.queue( elem, type ),
3925             startLength = queue.length,
3926             fn = queue.shift(),
3927             hooks = jQuery._queueHooks( elem, type ),
3928             next = function() {
3929                 jQuery.dequeue( elem, type );
3930             };
3931
3932         
// If the fx queue is dequeued, always remove the progress sentinel
3933         
if ( fn === "inprogress" ) {
3934             fn = queue.shift();
3935             startLength--;
3936         }
3937
3938         
if ( fn ) {
3939
3940             
// Add a progress sentinel to prevent the fx queue from being
3941             
// automatically dequeued
3942             
if ( type === "fx" ) {
3943                 queue.unshift(
"inprogress" );
3944             }
3945
3946             
// clear up the last queue stop function
3947             delete hooks.stop;
3948             fn.call( elem, next, hooks );
3949         }
3950
3951         
if ( !startLength && hooks ) {
3952             hooks.empty.fire();
3953         }
3954     },
3955
3956     
// not intended for public consumption - generates a queueHooks object, or returns the current one
3957     _queueHooks: function( elem, type ) {
3958         
var key = type + "queueHooks";
3959         
return jQuery._data( elem, key ) || jQuery._data( elem, key, {
3960             empty: jQuery.Callbacks(
"once memory").add(function() {
3961                 jQuery._removeData( elem, type +
"queue" );
3962                 jQuery._removeData( elem, key );
3963             })
3964         });
3965     }
3966 });
3967
3968 jQuery.fn.extend({
3969     queue: function( type, data ) {
3970         
var setter = 2;
3971
3972         
if ( typeof type !== "string" ) {
3973             data = type;
3974             type =
"fx";
3975             setter--;
3976         }
3977
3978         
if ( arguments.length < setter ) {
3979             
return jQuery.queue( this[0], type );
3980         }
3981
3982         
return data === undefined ?
3983             
this :
3984             
this.each(function() {
3985                 
var queue = jQuery.queue( this, type, data );
3986
3987                 
// ensure a hooks for this queue
3988                 jQuery._queueHooks(
this, type );
3989
3990                 
if ( type === "fx" && queue[0] !== "inprogress" ) {
3991                     jQuery.dequeue(
this, type );
3992                 }
3993             });
3994     },
3995     dequeue: function( type ) {
3996         
return this.each(function() {
3997             jQuery.dequeue(
this, type );
3998         });
3999     },
4000     
// Based off of the plugin by Clint Helfers, with permission.
4001     
// http://blindsignals.com/index.php/2009/07/jquery-delay/
4002     delay: function( time, type ) {
4003         time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
4004         type = type ||
"fx";
4005
4006         
return this.queue( type, function( next, hooks ) {
4007             
var timeout = setTimeout( next, time );
4008             hooks.stop = function() {
4009                 clearTimeout( timeout );
4010             };
4011         });
4012     },
4013     clearQueue: function( type ) {
4014         
return this.queue( type || "fx", [] );
4015     },
4016     
// Get a promise resolved when queues of a certain type
4017     
// are emptied (fx is the type by default)
4018     promise: function( type, obj ) {
4019         
var tmp,
4020             count =
1,
4021             defer = jQuery.Deferred(),
4022             elements =
this,
4023             i =
this.length,
4024             resolve = function() {
4025                 
if ( !( --count ) ) {
4026                     defer.resolveWith( elements, [ elements ] );
4027                 }
4028             };
4029
4030         
if ( typeof type !== "string" ) {
4031             obj = type;
4032             type = undefined;
4033         }
4034         type = type ||
"fx";
4035
4036         
while( i-- ) {
4037             tmp = jQuery._data( elements[ i ], type +
"queueHooks" );
4038             
if ( tmp && tmp.empty ) {
4039                 count++;
4040                 tmp.empty.
add( resolve );
4041             }
4042         }
4043         resolve();
4044         
return defer.promise( obj );
4045     }
4046 });

4047 var
nodeHook, boolHook,
4048     rclass = /[\t\r\n\f]/g,
4049     rreturn = /\r/g,
4050     rfocusable = /^(?:input|
select|textarea|button|object)$/i,
4051     rclickable = /^(?:a|area)$/i,
4052     ruseDefault = /^(?:
checked|selected)$/i,
4053     getSetAttribute = jQuery.support.getSetAttribute,
4054     getSetInput = jQuery.support.input;
4055
4056 jQuery.fn.extend({
4057     attr: function( name,
value ) {
4058         
return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
4059     },
4060
4061     removeAttr: function( name ) {
4062         
return this.each(function() {
4063             jQuery.removeAttr(
this, name );
4064         });
4065     },
4066
4067     prop: function( name,
value ) {
4068         
return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
4069     },
4070
4071     removeProp: function( name ) {
4072         name = jQuery.propFix[ name ] || name;
4073         
return this.each(function() {
4074             
// try/catch handles cases where IE balks (such as removing a property on window)
4075             
try {
4076                 
this[ name ] = undefined;
4077                 delete
this[ name ];
4078             }
catch( e ) {}
4079         });
4080     },
4081
4082     addClass: function(
value ) {
4083         
var classes, elem, cur, clazz, j,
4084             i =
0,
4085             len =
this.length,
4086             proceed =
typeof value === "string" && value;
4087
4088         
if ( jQuery.isFunction( value ) ) {
4089             
return this.each(function( j ) {
4090                 jQuery(
this ).addClass( value.call( this, j, this.className ) );
4091             });
4092         }
4093
4094         
if ( proceed ) {
4095             
// The disjunction here is for better compressibility (see removeClass)
4096             classes = (
value || "" ).match( core_rnotwhite ) || [];
4097
4098             
for ( ; i < len; i++ ) {
4099                 elem =
this[ i ];
4100                 cur = elem.nodeType ===
1 && ( elem.className ?
4101                     (
" " + elem.className + " " ).replace( rclass, " " ) :
4102                     
" "
4103                 );
4104
4105                 
if ( cur ) {
4106                     j =
0;
4107                     
while ( (clazz = classes[j++]) ) {
4108                         
if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
4109                             cur += clazz +
" ";
4110                         }
4111                     }
4112                     elem.className = jQuery.trim( cur );
4113
4114                 }
4115             }
4116         }
4117
4118         
return this;
4119     },
4120
4121     removeClass: function(
value ) {
4122         
var classes, elem, cur, clazz, j,
4123             i =
0,
4124             len =
this.length,
4125             proceed = arguments.length ===
0 || typeof value === "string" && value;
4126
4127         
if ( jQuery.isFunction( value ) ) {
4128             
return this.each(function( j ) {
4129                 jQuery(
this ).removeClass( value.call( this, j, this.className ) );
4130             });
4131         }
4132         
if ( proceed ) {
4133             classes = (
value || "" ).match( core_rnotwhite ) || [];
4134
4135             
for ( ; i < len; i++ ) {
4136                 elem =
this[ i ];
4137                 
// This expression is here for better compressibility (see addClass)
4138                 cur = elem.nodeType ===
1 && ( elem.className ?
4139                     (
" " + elem.className + " " ).replace( rclass, " " ) :
4140                     
""
4141                 );
4142
4143                 
if ( cur ) {
4144                     j =
0;
4145                     
while ( (clazz = classes[j++]) ) {
4146                         
// Remove *all* instances
4147                         
while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
4148                             cur = cur.replace(
" " + clazz + " ", " " );
4149                         }
4150                     }
4151                     elem.className =
value ? jQuery.trim( cur ) : "";
4152                 }
4153             }
4154         }
4155
4156         
return this;
4157     },
4158
4159     toggleClass: function(
value, stateVal ) {
4160         
var type = typeof value;
4161
4162         
if ( typeof stateVal === "boolean" && type === "string" ) {
4163             
return stateVal ? this.addClass( value ) : this.removeClass( value );
4164         }
4165
4166         
if ( jQuery.isFunction( value ) ) {
4167             
return this.each(function( i ) {
4168                 jQuery(
this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
4169             });
4170         }
4171
4172         
return this.each(function() {
4173             
if ( type === "string" ) {
4174                 
// toggle individual class names
4175                 
var className,
4176                     i =
0,
4177                     self = jQuery(
this ),
4178                     classNames =
value.match( core_rnotwhite ) || [];
4179
4180                 
while ( (className = classNames[ i++ ]) ) {
4181                     
// check each className given, space separated list
4182                     
if ( self.hasClass( className ) ) {
4183                         self.removeClass( className );
4184                     }
else {
4185                         self.addClass( className );
4186                     }
4187                 }
4188
4189             
// Toggle whole class name
4190             }
else if ( type === core_strundefined || type === "boolean" ) {
4191                 
if ( this.className ) {
4192                     
// store className if set
4193                     jQuery._data(
this, "__className__", this.className );
4194                 }
4195
4196                 
// If the element has a class name or if we're passed "false",
4197                 
// then remove the whole classname (if there was one, the above saved it).
4198                 
// Otherwise bring back whatever was previously saved (if anything),
4199                 
// falling back to the empty string if nothing was stored.
4200                 
this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
4201             }
4202         });
4203     },
4204
4205     hasClass: function( selector ) {
4206         
var className = " " + selector + " ",
4207             i =
0,
4208             l =
this.length;
4209         
for ( ; i < l; i++ ) {
4210             
if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
4211                 
return true;
4212             }
4213         }
4214
4215         
return false;
4216     },
4217
4218     val: function(
value ) {
4219         
var ret, hooks, isFunction,
4220             elem =
this[0];
4221
4222         
if ( !arguments.length ) {
4223             
if ( elem ) {
4224                 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
4225
4226                 
if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
4227                     
return ret;
4228                 }
4229
4230                 ret = elem.
value;
4231
4232                 
return typeof ret === "string" ?
4233                     
// handle most common string cases
4234                     ret.replace(rreturn,
"") :
4235                     
// handle cases where value is null/undef or number
4236                     ret ==
null ? "" : ret;
4237             }
4238
4239             
return;
4240         }
4241
4242         isFunction = jQuery.isFunction(
value );
4243
4244         
return this.each(function( i ) {
4245             
var val;
4246
4247             
if ( this.nodeType !== 1 ) {
4248                 
return;
4249             }
4250
4251             
if ( isFunction ) {
4252                 val =
value.call( this, i, jQuery( this ).val() );
4253             }
else {
4254                 val =
value;
4255             }
4256
4257             
// Treat null/undefined as ""; convert numbers to string
4258             
if ( val == null ) {
4259                 val =
"";
4260             }
else if ( typeof val === "number" ) {
4261                 val +=
"";
4262             }
else if ( jQuery.isArray( val ) ) {
4263                 val = jQuery.map(val, function (
value ) {
4264                     
return value == null ? "" : value + "";
4265                 });
4266             }
4267
4268             hooks = jQuery.valHooks[
this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
4269
4270             
// If set returns undefined, fall back to normal setting
4271             
if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
4272                 
this.value = val;
4273             }
4274         });
4275     }
4276 });
4277
4278 jQuery.extend({
4279     valHooks: {
4280         option: {
4281             
get: function( elem ) {
4282                 
// Use proper attribute retrieval(#6932, #12072)
4283                 
var val = jQuery.find.attr( elem, "value" );
4284                 
return val != null ?
4285                     val :
4286                     elem.text;
4287             }
4288         },
4289         
select: {
4290             
get: function( elem ) {
4291                 
var value, option,
4292                     options = elem.options,
4293                     index = elem.selectedIndex,
4294                     one = elem.type ===
"select-one" || index < 0,
4295                     values = one ?
null : [],
4296                     max = one ? index +
1 : options.length,
4297                     i = index <
0 ?
4298                         max :
4299                         one ? index :
0;
4300
4301                 
// Loop through all the selected options
4302                 
for ( ; i < max; i++ ) {
4303                     option = options[ i ];
4304
4305                     
// oldIE doesn't update selected after form reset (#2551)
4306                     
if ( ( option.selected || i === index ) &&
4307                             
// Don't return options that are disabled or in a disabled optgroup
4308                             ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(
"disabled") === null ) &&
4309                             ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode,
"optgroup" ) ) ) {
4310
4311                         
// Get the specific value for the option
4312                         
value = jQuery( option ).val();
4313
4314                         
// We don't need an array for one selects
4315                         
if ( one ) {
4316                             
return value;
4317                         }
4318
4319                         
// Multi-Selects return an array
4320                         values.push(
value );
4321                     }
4322                 }
4323
4324                 
return values;
4325             },
4326
4327             
set: function( elem, value ) {
4328                 
var optionSet, option,
4329                     options = elem.options,
4330                     values = jQuery.makeArray(
value ),
4331                     i = options.length;
4332
4333                 
while ( i-- ) {
4334                     option = options[ i ];
4335                     
if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
4336                         optionSet =
true;
4337                     }
4338                 }
4339
4340                 
// force browsers to behave consistently when non-matching value is set
4341                 
if ( !optionSet ) {
4342                     elem.selectedIndex = -
1;
4343                 }
4344                 
return values;
4345             }
4346         }
4347     },
4348
4349     attr: function( elem, name,
value ) {
4350         
var hooks, ret,
4351             nType = elem.nodeType;
4352
4353         
// don't get/set attributes on text, comment and attribute nodes
4354         
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
4355             
return;
4356         }
4357
4358         
// Fallback to prop when attributes are not supported
4359         
if ( typeof elem.getAttribute === core_strundefined ) {
4360             
return jQuery.prop( elem, name, value );
4361         }
4362
4363         
// All attributes are lowercase
4364         
// Grab necessary hook if one is defined
4365         
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
4366             name = name.toLowerCase();
4367             hooks = jQuery.attrHooks[ name ] ||
4368                 ( jQuery.expr.match.
bool.test( name ) ? boolHook : nodeHook );
4369         }
4370
4371         
if ( value !== undefined ) {
4372
4373             
if ( value === null ) {
4374                 jQuery.removeAttr( elem, name );
4375
4376             }
else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
4377                 
return ret;
4378
4379             }
else {
4380                 elem.setAttribute( name,
value + "" );
4381                 
return value;
4382             }
4383
4384         }
else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
4385             
return ret;
4386
4387         }
else {
4388             ret = jQuery.find.attr( elem, name );
4389
4390             
// Non-existent attributes return null, we normalize to undefined
4391             
return ret == null ?
4392                 undefined :
4393                 ret;
4394         }
4395     },
4396
4397     removeAttr: function( elem,
value ) {
4398         
var name, propName,
4399             i =
0,
4400             attrNames =
value && value.match( core_rnotwhite );
4401
4402         
if ( attrNames && elem.nodeType === 1 ) {
4403             
while ( (name = attrNames[i++]) ) {
4404                 propName = jQuery.propFix[ name ] || name;
4405
4406                 
// Boolean attributes get special treatment (#10870)
4407                 
if ( jQuery.expr.match.bool.test( name ) ) {
4408                     
// Set corresponding property to false
4409                     
if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
4410                         elem[ propName ] =
false;
4411                     
// Support: IE<9
4412                     
// Also clear defaultChecked/defaultSelected (if appropriate)
4413                     }
else {
4414                         elem[ jQuery.camelCase(
"default-" + name ) ] =
4415                             elem[ propName ] =
false;
4416                     }
4417
4418                 
// See #9699 for explanation of this approach (setting first, then removal)
4419                 }
else {
4420                     jQuery.attr( elem, name,
"" );
4421                 }
4422
4423                 elem.removeAttribute( getSetAttribute ? name : propName );
4424             }
4425         }
4426     },
4427
4428     attrHooks: {
4429         type: {
4430             
set: function( elem, value ) {
4431                 
if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
4432                     
// Setting the type on a radio button after the value resets the value in IE6-9
4433                     
// Reset value to default in case type is set after value during creation
4434                     
var val = elem.value;
4435                     elem.setAttribute(
"type", value );
4436                     
if ( val ) {
4437                         elem.
value = val;
4438                     }
4439                     
return value;
4440                 }
4441             }
4442         }
4443     },
4444
4445     propFix: {
4446         
"for": "htmlFor",
4447         
"class": "className"
4448     },
4449
4450     prop: function( elem, name,
value ) {
4451         
var ret, hooks, notxml,
4452             nType = elem.nodeType;
4453
4454         
// don't get/set properties on text, comment and attribute nodes
4455         
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
4456             
return;
4457         }
4458
4459         notxml = nType !==
1 || !jQuery.isXMLDoc( elem );
4460
4461         
if ( notxml ) {
4462             
// Fix name and attach hooks
4463             name = jQuery.propFix[ name ] || name;
4464             hooks = jQuery.propHooks[ name ];
4465         }
4466
4467         
if ( value !== undefined ) {
4468             
return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
4469                 ret :
4470                 ( elem[ name ] =
value );
4471
4472         }
else {
4473             
return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
4474                 ret :
4475                 elem[ name ];
4476         }
4477     },
4478
4479     propHooks: {
4480         tabIndex: {
4481             
get: function( elem ) {
4482                 
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
4483                 
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
4484                 
// Use proper attribute retrieval(#12072)
4485                 
var tabindex = jQuery.find.attr( elem, "tabindex" );
4486
4487                 
return tabindex ?
4488                     parseInt( tabindex,
10 ) :
4489                     rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
4490                         
0 :
4491                         -
1;
4492             }
4493         }
4494     }
4495 });

4496
4497 // Hooks
for boolean attributes
4498 boolHook = {
4499     
set: function( elem, value, name ) {
4500         
if ( value === false ) {
4501             
// Remove boolean attributes when set to false
4502             jQuery.removeAttr( elem, name );
4503         }
else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
4504             
// IE<8 needs the *property* name
4505             elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
4506
4507         
// Use defaultChecked and defaultSelected for oldIE
4508         }
else {
4509             elem[ jQuery.camelCase(
"default-" + name ) ] = elem[ name ] = true;
4510         }
4511
4512         
return name;
4513     }
4514 };
4515 jQuery.each( jQuery.expr.match.
bool.source.match( /\w+/g ), function( i, name ) {
4516     
var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
4517
4518     jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
4519         function( elem, name, isXML ) {
4520             
var fn = jQuery.expr.attrHandle[ name ],
4521                 ret = isXML ?
4522                     undefined :
4523                     
/* jshint eqeqeq: false */
4524                     (jQuery.expr.attrHandle[ name ] = undefined) !=
4525                         getter( elem, name, isXML ) ?
4526
4527                         name.toLowerCase() :
4528                         
null;
4529             jQuery.expr.attrHandle[ name ] = fn;
4530             
return ret;
4531         } :
4532         function( elem, name, isXML ) {
4533             
return isXML ?
4534                 undefined :
4535                 elem[ jQuery.camelCase(
"default-" + name ) ] ?
4536                     name.toLowerCase() :
4537                     
null;
4538         };
4539 });

4540
4541 // fix oldIE attroperties

4542 if
( !getSetInput || !getSetAttribute ) {
4543     jQuery.attrHooks.
value = {
4544         
set: function( elem, value, name ) {
4545             
if ( jQuery.nodeName( elem, "input" ) ) {
4546                 
// Does not return so that setAttribute is also used
4547                 elem.defaultValue =
value;
4548             }
else {
4549                 
// Use nodeHook if defined (#1954); otherwise setAttribute is fine
4550                 
return nodeHook && nodeHook.set( elem, value, name );
4551             }
4552         }
4553     };
4554 }

4555
4556 // IE6/
7 do not support getting/setting some attributes with get/setAttribute
4557 if
( !getSetAttribute ) {
4558
4559     
// Use this for any attribute in IE6/7
4560     
// This fixes almost every IE6/7 issue
4561     nodeHook = {
4562         
set: function( elem, value, name ) {
4563             
// Set the existing or create a new attribute node
4564             
var ret = elem.getAttributeNode( name );
4565             
if ( !ret ) {
4566                 elem.setAttributeNode(
4567                     (ret = elem.ownerDocument.createAttribute( name ))
4568                 );
4569             }
4570
4571             ret.
value = value += "";
4572
4573             
// Break association with cloned elements by also using setAttribute (#9646)
4574             
return name === "value" || value === elem.getAttribute( name ) ?
4575                 
value :
4576                 undefined;
4577         }
4578     };
4579     jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
4580         
// Some attributes are constructed with empty-string values when not defined
4581         function( elem, name, isXML ) {
4582             
var ret;
4583             
return isXML ?
4584                 undefined :
4585                 (ret = elem.getAttributeNode( name )) && ret.
value !== "" ?
4586                     ret.
value :
4587                     
null;
4588         };
4589     jQuery.valHooks.button = {
4590         
get: function( elem, name ) {
4591             
var ret = elem.getAttributeNode( name );
4592             
return ret && ret.specified ?
4593                 ret.
value :
4594                 undefined;
4595         },
4596         
set: nodeHook.set
4597     };
4598
4599     
// Set contenteditable to false on removals(#10429)
4600     
// Setting to empty string throws an error as an invalid value
4601     jQuery.attrHooks.contenteditable = {
4602         
set: function( elem, value, name ) {
4603             nodeHook.
set( elem, value === "" ? false : value, name );
4604         }
4605     };
4606
4607     
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
4608     
// This is for removals
4609     jQuery.each([
"width", "height" ], function( i, name ) {
4610         jQuery.attrHooks[ name ] = {
4611             
set: function( elem, value ) {
4612                 
if ( value === "" ) {
4613                     elem.setAttribute( name,
"auto" );
4614                     
return value;
4615                 }
4616             }
4617         };
4618     });
4619 }

4620
4621
4622 // Some attributes require a special call
on IE
4623 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.
85%29.aspx
4624 if
( !jQuery.support.hrefNormalized ) {
4625     
// href/src property should get the full normalized URL (#10299/#12915)
4626     jQuery.each([
"href", "src" ], function( i, name ) {
4627         jQuery.propHooks[ name ] = {
4628             
get: function( elem ) {
4629                 
return elem.getAttribute( name, 4 );
4630             }
4631         };
4632     });
4633 }

4634
4635 if
( !jQuery.support.style ) {
4636     jQuery.attrHooks.style = {
4637         
get: function( elem ) {
4638             
// Return undefined in the case of empty string
4639             
// Note: IE uppercases css property names, but if we were to .toLowerCase()
4640             
// .cssText, that would destroy case senstitivity in URL's, like in "background"
4641             
return elem.style.cssText || undefined;
4642         },
4643         
set: function( elem, value ) {
4644             
return ( elem.style.cssText = value + "" );
4645         }
4646     };
4647 }

4648
4649 // Safari mis-reports the
default selected property of an option
4650 // Accessing the parent
's selectedIndex property fixes it
4651 if
( !jQuery.support.optSelected ) {
4652     jQuery.propHooks.selected = {
4653         
get: function( elem ) {
4654             
var parent = elem.parentNode;
4655
4656             
if ( parent ) {
4657                 parent.selectedIndex;
4658
4659                 
// Make sure that it also works with optgroups, see #5701
4660                 
if ( parent.parentNode ) {
4661                     parent.parentNode.selectedIndex;
4662                 }
4663             }
4664             
return null;
4665         }
4666     };
4667 }
4668
4669 jQuery.each([
4670     
"tabIndex",
4671     
"readOnly",
4672     
"maxLength",
4673     
"cellSpacing",
4674     
"cellPadding",
4675     
"rowSpan",
4676     
"colSpan",
4677     
"useMap",
4678     
"frameBorder",
4679     
"contentEditable"
4680 ], function() {
4681     jQuery.propFix[
this.toLowerCase() ] = this;
4682 });

4683
4684 // IE6/
7 call enctype encoding
4685 if
( !jQuery.support.enctype ) {
4686     jQuery.propFix.enctype =
"encoding";
4687 }

4688
4689 // Radios and checkboxes getter/setter

4690 jQuery.each([
"radio", "checkbox" ], function() {
4691     jQuery.valHooks[
this ] = {
4692         
set: function( elem, value ) {
4693             
if ( jQuery.isArray( value ) ) {
4694                 
return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
4695             }
4696         }
4697     };
4698     
if ( !jQuery.support.checkOn ) {
4699         jQuery.valHooks[
this ].get = function( elem ) {
4700             
// Support: Webkit
4701             
// "" is returned instead of "on" if a value isn't specified
4702             
return elem.getAttribute("value") === null ? "on" : elem.value;
4703         };
4704     }
4705 });

4706 var
rformElems = /^(?:input|select|textarea)$/i,
4707     rkeyEvent = /^key/,
4708     rmouseEvent = /^(?:mouse|contextmenu)|click/,
4709     rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4710     rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
4711
4712 function returnTrue() {
4713     
return true;
4714 }
4715
4716 function returnFalse() {
4717     
return false;
4718 }
4719
4720 function safeActiveElement() {
4721     
try {
4722         
return document.activeElement;
4723     }
catch ( err ) { }
4724 }

4725
4726 /*
4727  * Helper functions
for managing events -- not part of the public interface.
4728  * Props to Dean Edwards
' addEvent library for many of the ideas.
4729  */

4730 jQuery.
event = {
4731
4732     
global: {},
4733
4734     
add: function( elem, types, handler, data, selector ) {
4735         
var tmp, events, t, handleObjIn,
4736             special, eventHandle, handleObj,
4737             handlers, type, namespaces, origType,
4738             elemData = jQuery._data( elem );
4739
4740         
// Don't attach events to noData or text/comment nodes (but allow plain objects)
4741         
if ( !elemData ) {
4742             
return;
4743         }
4744
4745         
// Caller can pass in an object of custom data in lieu of the handler
4746         
if ( handler.handler ) {
4747             handleObjIn = handler;
4748             handler = handleObjIn.handler;
4749             selector = handleObjIn.selector;
4750         }
4751
4752         
// Make sure that the handler has a unique ID, used to find/remove it later
4753         
if ( !handler.guid ) {
4754             handler.guid = jQuery.guid++;
4755         }
4756
4757         
// Init the element's event structure and main handler, if this is the first
4758         
if ( !(events = elemData.events) ) {
4759             events = elemData.events = {};
4760         }
4761         
if ( !(eventHandle = elemData.handle) ) {
4762             eventHandle = elemData.handle = function( e ) {
4763                 
// Discard the second event of a jQuery.event.trigger() and
4764                 
// when an event is called after a page has unloaded
4765                 
return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
4766                     jQuery.
event.dispatch.apply( eventHandle.elem, arguments ) :
4767                     undefined;
4768             };
4769             
// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
4770             eventHandle.elem = elem;
4771         }
4772
4773         
// Handle multiple events separated by a space
4774         types = ( types ||
"" ).match( core_rnotwhite ) || [""];
4775         t = types.length;
4776         
while ( t-- ) {
4777             tmp = rtypenamespace.exec( types[t] ) || [];
4778             type = origType = tmp[
1];
4779             namespaces = ( tmp[
2] || "" ).split( "." ).sort();
4780
4781             
// There *must* be a type, no attaching namespace-only handlers
4782             
if ( !type ) {
4783                 
continue;
4784             }
4785
4786             
// If event changes its type, use the special event handlers for the changed type
4787             special = jQuery.
event.special[ type ] || {};
4788
4789             
// If selector defined, determine special event api type, otherwise given type
4790             type = ( selector ? special.delegateType : special.bindType ) || type;
4791
4792             
// Update special based on newly reset type
4793             special = jQuery.
event.special[ type ] || {};
4794
4795             
// handleObj is passed to all event handlers
4796             handleObj = jQuery.extend({
4797                 type: type,
4798                 origType: origType,
4799                 data: data,
4800                 handler: handler,
4801                 guid: handler.guid,
4802                 selector: selector,
4803                 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4804                 
namespace: namespaces.join(".")
4805             }, handleObjIn );
4806
4807             
// Init the event handler queue if we're the first
4808             
if ( !(handlers = events[ type ]) ) {
4809                 handlers = events[ type ] = [];
4810                 handlers.delegateCount =
0;
4811
4812                 
// Only use addEventListener/attachEvent if the special events handler returns false
4813                 
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4814                     
// Bind the global event handler to the element
4815                     
if ( elem.addEventListener ) {
4816                         elem.addEventListener( type, eventHandle,
false );
4817
4818                     }
else if ( elem.attachEvent ) {
4819                         elem.attachEvent(
"on" + type, eventHandle );
4820                     }
4821                 }
4822             }
4823
4824             
if ( special.add ) {
4825                 special.
add.call( elem, handleObj );
4826
4827                 
if ( !handleObj.handler.guid ) {
4828                     handleObj.handler.guid = handler.guid;
4829                 }
4830             }
4831
4832             
// Add to the element's handler list, delegates in front
4833             
if ( selector ) {
4834                 handlers.splice( handlers.delegateCount++,
0, handleObj );
4835             }
else {
4836                 handlers.push( handleObj );
4837             }
4838
4839             
// Keep track of which events have ever been used, for event optimization
4840             jQuery.
event.global[ type ] = true;
4841         }
4842
4843         
// Nullify elem to prevent memory leaks in IE
4844         elem =
null;
4845     },
4846
4847     
// Detach an event or set of events from an element
4848     
remove: function( elem, types, handler, selector, mappedTypes ) {
4849         
var j, handleObj, tmp,
4850             origCount, t, events,
4851             special, handlers, type,
4852             namespaces, origType,
4853             elemData = jQuery.hasData( elem ) && jQuery._data( elem );
4854
4855         
if ( !elemData || !(events = elemData.events) ) {
4856             
return;
4857         }
4858
4859         
// Once for each type.namespace in types; type may be omitted
4860         types = ( types ||
"" ).match( core_rnotwhite ) || [""];
4861         t = types.length;
4862         
while ( t-- ) {
4863             tmp = rtypenamespace.exec( types[t] ) || [];
4864             type = origType = tmp[
1];
4865             namespaces = ( tmp[
2] || "" ).split( "." ).sort();
4866
4867             
// Unbind all events (on this namespace, if provided) for the element
4868             
if ( !type ) {
4869                 
for ( type in events ) {
4870                     jQuery.
event.remove( elem, type + types[ t ], handler, selector, true );
4871                 }
4872                 
continue;
4873             }
4874
4875             special = jQuery.
event.special[ type ] || {};
4876             type = ( selector ? special.delegateType : special.bindType ) || type;
4877             handlers = events[ type ] || [];
4878             tmp = tmp[
2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
4879
4880             
// Remove matching events
4881             origCount = j = handlers.length;
4882             
while ( j-- ) {
4883                 handleObj = handlers[ j ];
4884
4885                 
if ( ( mappedTypes || origType === handleObj.origType ) &&
4886                     ( !handler || handler.guid === handleObj.guid ) &&
4887                     ( !tmp || tmp.test( handleObj.
namespace ) ) &&
4888                     ( !selector || selector === handleObj.selector || selector ===
"**" && handleObj.selector ) ) {
4889                     handlers.splice( j,
1 );
4890
4891                     
if ( handleObj.selector ) {
4892                         handlers.delegateCount--;
4893                     }
4894                     
if ( special.remove ) {
4895                         special.
remove.call( elem, handleObj );
4896                     }
4897                 }
4898             }
4899
4900             
// Remove generic event handler if we removed something and no more handlers exist
4901             
// (avoids potential for endless recursion during removal of special event handlers)
4902             
if ( origCount && !handlers.length ) {
4903                 
if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
4904                     jQuery.removeEvent( elem, type, elemData.handle );
4905                 }
4906
4907                 delete events[ type ];
4908             }
4909         }
4910
4911         
// Remove the expando if it's no longer used
4912         
if ( jQuery.isEmptyObject( events ) ) {
4913             delete elemData.handle;
4914
4915             
// removeData also checks for emptiness and clears the expando if empty
4916             
// so use it instead of delete
4917             jQuery._removeData( elem,
"events" );
4918         }
4919     },
4920
4921     trigger: function(
event, data, elem, onlyHandlers ) {
4922         
var handle, ontype, cur,
4923             bubbleType, special, tmp, i,
4924             eventPath = [ elem || document ],
4925             type = core_hasOwn.call(
event, "type" ) ? event.type : event,
4926             namespaces = core_hasOwn.call(
event, "namespace" ) ? event.namespace.split(".") : [];
4927
4928         cur = tmp = elem = elem || document;
4929
4930         
// Don't do events on text and comment nodes
4931         
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
4932             
return;
4933         }
4934
4935         
// focus/blur morphs to focusin/out; ensure we're not firing them right now
4936         
if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
4937             
return;
4938         }
4939
4940         
if ( type.indexOf(".") >= 0 ) {
4941             
// Namespaced trigger; create a regexp to match event type in handle()
4942             namespaces = type.split(
".");
4943             type = namespaces.shift();
4944             namespaces.sort();
4945         }
4946         ontype = type.indexOf(
":") < 0 && "on" + type;
4947
4948         
// Caller can pass in a jQuery.Event object, Object, or just an event type string
4949         
event = event[ jQuery.expando ] ?
4950             
event :
4951             
new jQuery.Event( type, typeof event === "object" && event );
4952
4953         
// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4954         
event.isTrigger = onlyHandlers ? 2 : 3;
4955         
event.namespace = namespaces.join(".");
4956         
event.namespace_re = event.namespace ?
4957             
new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
4958             
null;
4959
4960         
// Clean up the event in case it is being reused
4961         
event.result = undefined;
4962         
if ( !event.target ) {
4963             
event.target = elem;
4964         }
4965
4966         
// Clone any incoming data and prepend the event, creating the handler arg list
4967         data = data ==
null ?
4968             [
event ] :
4969             jQuery.makeArray( data, [
event ] );
4970
4971         
// Allow special events to draw outside the lines
4972         special = jQuery.
event.special[ type ] || {};
4973         
if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
4974             
return;
4975         }
4976
4977         
// Determine event propagation path in advance, per W3C events spec (#9951)
4978         
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4979         
if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
4980
4981             bubbleType = special.delegateType || type;
4982             
if ( !rfocusMorph.test( bubbleType + type ) ) {
4983                 cur = cur.parentNode;
4984             }
4985             
for ( ; cur; cur = cur.parentNode ) {
4986                 eventPath.push( cur );
4987                 tmp = cur;
4988             }
4989
4990             
// Only add window if we got to document (e.g., not plain obj or detached DOM)
4991             
if ( tmp === (elem.ownerDocument || document) ) {
4992                 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
4993             }
4994         }
4995
4996         
// Fire handlers on the event path
4997         i =
0;
4998         
while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
4999
5000             
event.type = i > 1 ?
5001                 bubbleType :
5002                 special.bindType || type;
5003
5004             
// jQuery handler
5005             handle = ( jQuery._data( cur,
"events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
5006             
if ( handle ) {
5007                 handle.apply( cur, data );
5008             }
5009
5010             
// Native handler
5011             handle = ontype && cur[ ontype ];
5012             
if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
5013                 
event.preventDefault();
5014             }
5015         }
5016         
event.type = type;
5017
5018         
// If nobody prevented the default action, do it now
5019         
if ( !onlyHandlers && !event.isDefaultPrevented() ) {
5020
5021             
if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
5022                 jQuery.acceptData( elem ) ) {
5023
5024                 
// Call a native DOM method on the target with the same name name as the event.
5025                 
// Can't use an .isFunction() check here because IE6/7 fails that test.
5026                 
// Don't do default actions on window, that's where global variables be (#6170)
5027                 
if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
5028
5029                     
// Don't re-trigger an onFOO event when we call its FOO() method
5030                     tmp = elem[ ontype ];
5031
5032                     
if ( tmp ) {
5033                         elem[ ontype ] =
null;
5034                     }
5035
5036                     
// Prevent re-triggering of the same event, since we already bubbled it above
5037                     jQuery.
event.triggered = type;
5038                     
try {
5039                         elem[ type ]();
5040                     }
catch ( e ) {
5041                         
// IE<9 dies on focus/blur to hidden element (#1486,#12518)
5042                         
// only reproducible on winXP IE8 native, not IE9 in IE8 mode
5043                     }
5044                     jQuery.
event.triggered = undefined;
5045
5046                     
if ( tmp ) {
5047                         elem[ ontype ] = tmp;
5048                     }
5049                 }
5050             }
5051         }
5052
5053         
return event.result;
5054     },
5055
5056     dispatch: function(
event ) {
5057
5058         
// Make a writable jQuery.Event from the native event object
5059         
event = jQuery.event.fix( event );
5060
5061         
var i, ret, handleObj, matched, j,
5062             handlerQueue = [],
5063             args = core_slice.call( arguments ),
5064             handlers = ( jQuery._data(
this, "events" ) || {} )[ event.type ] || [],
5065             special = jQuery.
event.special[ event.type ] || {};
5066
5067         
// Use the fix-ed jQuery.Event rather than the (read-only) native event
5068         args[
0] = event;
5069         
event.delegateTarget = this;
5070
5071         
// Call the preDispatch hook for the mapped type, and let it bail if desired
5072         
if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5073             
return;
5074         }
5075
5076         
// Determine handlers
5077         handlerQueue = jQuery.
event.handlers.call( this, event, handlers );
5078
5079         
// Run delegates first; they may want to stop propagation beneath us
5080         i =
0;
5081         
while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
5082             
event.currentTarget = matched.elem;
5083
5084             j =
0;
5085             
while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
5086
5087                 
// Triggered event must either 1) have no namespace, or
5088                 
// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
5089                 
if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
5090
5091                     
event.handleObj = handleObj;
5092                     
event.data = handleObj.data;
5093
5094                     ret = ( (jQuery.
event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
5095                             .apply( matched.elem, args );
5096
5097                     
if ( ret !== undefined ) {
5098                         
if ( (event.result = ret) === false ) {
5099                             
event.preventDefault();
5100                             
event.stopPropagation();
5101                         }
5102                     }
5103                 }
5104             }
5105         }
5106
5107         
// Call the postDispatch hook for the mapped type
5108         
if ( special.postDispatch ) {
5109             special.postDispatch.call(
this, event );
5110         }
5111
5112         
return event.result;
5113     },
5114
5115     handlers: function(
event, handlers ) {
5116         
var sel, handleObj, matches, i,
5117             handlerQueue = [],
5118             delegateCount = handlers.delegateCount,
5119             cur =
event.target;
5120
5121         
// Find delegate handlers
5122         
// Black-hole SVG <use> instance trees (#13180)
5123         
// Avoid non-left-click bubbling in Firefox (#3861)
5124         
if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
5125
5126             
/* jshint eqeqeq: false */
5127             
for ( ; cur != this; cur = cur.parentNode || this ) {
5128                 
/* jshint eqeqeq: true */
5129
5130                 
// Don't check non-elements (#13208)
5131                 
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5132                 
if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
5133                     matches = [];
5134                     
for ( i = 0; i < delegateCount; i++ ) {
5135                         handleObj = handlers[ i ];
5136
5137                         
// Don't conflict with Object.prototype properties (#13203)
5138                         sel = handleObj.selector +
" ";
5139
5140                         
if ( matches[ sel ] === undefined ) {
5141                             matches[ sel ] = handleObj.needsContext ?
5142                                 jQuery( sel,
this ).index( cur ) >= 0 :
5143                                 jQuery.find( sel,
this, null, [ cur ] ).length;
5144                         }
5145                         
if ( matches[ sel ] ) {
5146                             matches.push( handleObj );
5147                         }
5148                     }
5149                     
if ( matches.length ) {
5150                         handlerQueue.push({ elem: cur, handlers: matches });
5151                     }
5152                 }
5153             }
5154         }
5155
5156         
// Add the remaining (directly-bound) handlers
5157         
if ( delegateCount < handlers.length ) {
5158             handlerQueue.push({ elem:
this, handlers: handlers.slice( delegateCount ) });
5159         }
5160
5161         
return handlerQueue;
5162     },
5163
5164     fix: function(
event ) {
5165         
if ( event[ jQuery.expando ] ) {
5166             
return event;
5167         }
5168
5169         
// Create a writable copy of the event object and normalize some properties
5170         
var i, prop, copy,
5171             type =
event.type,
5172             originalEvent =
event,
5173             fixHook =
this.fixHooks[ type ];
5174
5175         
if ( !fixHook ) {
5176             
this.fixHooks[ type ] = fixHook =
5177                 rmouseEvent.test( type ) ?
this.mouseHooks :
5178                 rkeyEvent.test( type ) ?
this.keyHooks :
5179                 {};
5180         }
5181         copy = fixHook.props ?
this.props.concat( fixHook.props ) : this.props;
5182
5183         
event = new jQuery.Event( originalEvent );
5184
5185         i = copy.length;
5186         
while ( i-- ) {
5187             prop = copy[ i ];
5188             
event[ prop ] = originalEvent[ prop ];
5189         }
5190
5191         
// Support: IE<9
5192         
// Fix target property (#1925)
5193         
if ( !event.target ) {
5194             
event.target = originalEvent.srcElement || document;
5195         }
5196
5197         
// Support: Chrome 23+, Safari?
5198         
// Target should not be a text node (#504, #13143)
5199         
if ( event.target.nodeType === 3 ) {
5200             
event.target = event.target.parentNode;
5201         }
5202
5203         
// Support: IE<9
5204         
// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
5205         
event.metaKey = !!event.metaKey;
5206
5207         
return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
5208     },
5209
5210     
// Includes some event props shared by KeyEvent and MouseEvent
5211     props:
"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
5212
5213     fixHooks: {},
5214
5215     keyHooks: {
5216         props:
"char charCode key keyCode".split(" "),
5217         filter: function(
event, original ) {
5218
5219             
// Add which for key events
5220             
if ( event.which == null ) {
5221                 
event.which = original.charCode != null ? original.charCode : original.keyCode;
5222             }
5223
5224             
return event;
5225         }
5226     },
5227
5228     mouseHooks: {
5229         props:
"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
5230         filter: function(
event, original ) {
5231             
var body, eventDoc, doc,
5232                 button = original.button,
5233                 fromElement = original.fromElement;
5234
5235             
// Calculate pageX/Y if missing and clientX/Y available
5236             
if ( event.pageX == null && original.clientX != null ) {
5237                 eventDoc =
event.target.ownerDocument || document;
5238                 doc = eventDoc.documentElement;
5239                 body = eventDoc.body;
5240
5241                 
event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
5242                 
event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
5243             }
5244
5245             
// Add relatedTarget, if necessary
5246             
if ( !event.relatedTarget && fromElement ) {
5247                 
event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
5248             }
5249
5250             
// Add which for click: 1 === left; 2 === middle; 3 === right
5251             
// Note: button is not normalized, so don't use it
5252             
if ( !event.which && button !== undefined ) {
5253                 
event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
5254             }
5255
5256             
return event;
5257         }
5258     },
5259
5260     special: {
5261         load: {
5262             
// Prevent triggered image.load events from bubbling to window.load
5263             noBubble:
true
5264         },
5265         focus: {
5266             
// Fire native event if possible so blur/focus sequence is correct
5267             trigger: function() {
5268                 
if ( this !== safeActiveElement() && this.focus ) {
5269                     
try {
5270                         
this.focus();
5271                         
return false;
5272                     }
catch ( e ) {
5273                         
// Support: IE<9
5274                         
// If we error on focus to hidden element (#1486, #12518),
5275                         
// let .trigger() run the handlers
5276                     }
5277                 }
5278             },
5279             delegateType:
"focusin"
5280         },
5281         blur: {
5282             trigger: function() {
5283                 
if ( this === safeActiveElement() && this.blur ) {
5284                     
this.blur();
5285                     
return false;
5286                 }
5287             },
5288             delegateType:
"focusout"
5289         },
5290         click: {
5291             
// For checkbox, fire native event so checked state will be right
5292             trigger: function() {
5293                 
if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
5294                     
this.click();
5295                     
return false;
5296                 }
5297             },
5298
5299             
// For cross-browser consistency, don't fire native .click() on links
5300             _default: function(
event ) {
5301                 
return jQuery.nodeName( event.target, "a" );
5302             }
5303         },
5304
5305         beforeunload: {
5306             postDispatch: function(
event ) {
5307
5308                 
// Even when returnValue equals to undefined Firefox will still show alert
5309                 
if ( event.result !== undefined ) {
5310                     
event.originalEvent.returnValue = event.result;
5311                 }
5312             }
5313         }
5314     },
5315
5316     simulate: function( type, elem,
event, bubble ) {
5317         
// Piggyback on a donor event to simulate a different one.
5318         
// Fake originalEvent to avoid donor's stopPropagation, but if the
5319         
// simulated event prevents default then we do the same on the donor.
5320         
var e = jQuery.extend(
5321             
new jQuery.Event(),
5322             
event,
5323             {
5324                 type: type,
5325                 isSimulated:
true,
5326                 originalEvent: {}
5327             }
5328         );
5329         
if ( bubble ) {
5330             jQuery.
event.trigger( e, null, elem );
5331         }
else {
5332             jQuery.
event.dispatch.call( elem, e );
5333         }
5334         
if ( e.isDefaultPrevented() ) {
5335             
event.preventDefault();
5336         }
5337     }
5338 };
5339
5340 jQuery.removeEvent = document.removeEventListener ?
5341     function( elem, type, handle ) {
5342         
if ( elem.removeEventListener ) {
5343             elem.removeEventListener( type, handle,
false );
5344         }
5345     } :
5346     function( elem, type, handle ) {
5347         
var name = "on" + type;
5348
5349         
if ( elem.detachEvent ) {
5350
5351             
// #8545, #7054, preventing memory leaks for custom events in IE6-8
5352             
// detachEvent needed property on element, by name of that event, to properly expose it to GC
5353             
if ( typeof elem[ name ] === core_strundefined ) {
5354                 elem[ name ] =
null;
5355             }
5356
5357             elem.detachEvent( name, handle );
5358         }
5359     };
5360
5361 jQuery.Event = function( src, props ) {
5362     
// Allow instantiation without the 'new' keyword
5363     
if ( !(this instanceof jQuery.Event) ) {
5364         
return new jQuery.Event( src, props );
5365     }
5366
5367     
// Event object
5368     
if ( src && src.type ) {
5369         
this.originalEvent = src;
5370         
this.type = src.type;
5371
5372         
// Events bubbling up the document may have been marked as prevented
5373         
// by a handler lower down the tree; reflect the correct value.
5374         
this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
5375             src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
5376
5377     
// Event type
5378     }
else {
5379         
this.type = src;
5380     }
5381
5382     
// Put explicitly provided properties onto the event object
5383     
if ( props ) {
5384         jQuery.extend(
this, props );
5385     }
5386
5387     
// Create a timestamp if incoming event doesn't have one
5388     
this.timeStamp = src && src.timeStamp || jQuery.now();
5389
5390     
// Mark it as fixed
5391     
this[ jQuery.expando ] = true;
5392 };

5393
5394 // jQuery.Event
is based on DOM3 Events as specified by the ECMAScript Language Binding
5395 // http://www.w3.org/TR/
2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5396 jQuery.Event.prototype = {
5397     isDefaultPrevented: returnFalse,
5398     isPropagationStopped: returnFalse,
5399     isImmediatePropagationStopped: returnFalse,
5400
5401     preventDefault: function() {
5402         
var e = this.originalEvent;
5403
5404         
this.isDefaultPrevented = returnTrue;
5405         
if ( !e ) {
5406             
return;
5407         }
5408
5409         
// If preventDefault exists, run it on the original event
5410         
if ( e.preventDefault ) {
5411             e.preventDefault();
5412
5413         
// Support: IE
5414         
// Otherwise set the returnValue property of the original event to false
5415         }
else {
5416             e.returnValue =
false;
5417         }
5418     },
5419     stopPropagation: function() {
5420         
var e = this.originalEvent;
5421
5422         
this.isPropagationStopped = returnTrue;
5423         
if ( !e ) {
5424             
return;
5425         }
5426         
// If stopPropagation exists, run it on the original event
5427         
if ( e.stopPropagation ) {
5428             e.stopPropagation();
5429         }
5430
5431         
// Support: IE
5432         
// Set the cancelBubble property of the original event to true
5433         e.cancelBubble =
true;
5434     },
5435     stopImmediatePropagation: function() {
5436         
this.isImmediatePropagationStopped = returnTrue;
5437         
this.stopPropagation();
5438     }
5439 };

5440
5441 // Create mouseenter/leave events
using mouseover/out and event-time checks
5442 jQuery.each({
5443     mouseenter:
"mouseover",
5444     mouseleave:
"mouseout"
5445 }, function( orig, fix ) {
5446     jQuery.
event.special[ orig ] = {
5447         delegateType: fix,
5448         bindType: fix,
5449
5450         handle: function(
event ) {
5451             
var ret,
5452                 target =
this,
5453                 related =
event.relatedTarget,
5454                 handleObj =
event.handleObj;
5455
5456             
// For mousenter/leave call the handler if related is outside the target.
5457             
// NB: No relatedTarget if the mouse left/entered the browser window
5458             
if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
5459                 
event.type = handleObj.origType;
5460                 ret = handleObj.handler.apply(
this, arguments );
5461                 
event.type = fix;
5462             }
5463             
return ret;
5464         }
5465     };
5466 });

5467
5468 // IE submit delegation

5469 if
( !jQuery.support.submitBubbles ) {
5470
5471     jQuery.
event.special.submit = {
5472         setup: function() {
5473             
// Only need this for delegated form submit events
5474             
if ( jQuery.nodeName( this, "form" ) ) {
5475                 
return false;
5476             }
5477
5478             
// Lazy-add a submit handler when a descendant form may potentially be submitted
5479             jQuery.
event.add( this, "click._submit keypress._submit", function( e ) {
5480                 
// Node name check avoids a VML-related crash in IE (#9807)
5481                 
var elem = e.target,
5482                     form = jQuery.nodeName( elem,
"input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
5483                 
if ( form && !jQuery._data( form, "submitBubbles" ) ) {
5484                     jQuery.
event.add( form, "submit._submit", function( event ) {
5485                         
event._submit_bubble = true;
5486                     });
5487                     jQuery._data( form,
"submitBubbles", true );
5488                 }
5489             });
5490             
// return undefined since we don't need an event listener
5491         },
5492
5493         postDispatch: function(
event ) {
5494             
// If form was submitted by the user, bubble the event up the tree
5495             
if ( event._submit_bubble ) {
5496                 delete
event._submit_bubble;
5497                 
if ( this.parentNode && !event.isTrigger ) {
5498                     jQuery.
event.simulate( "submit", this.parentNode, event, true );
5499                 }
5500             }
5501         },
5502
5503         teardown: function() {
5504             
// Only need this for delegated form submit events
5505             
if ( jQuery.nodeName( this, "form" ) ) {
5506                 
return false;
5507             }
5508
5509             
// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
5510             jQuery.
event.remove( this, "._submit" );
5511         }
5512     };
5513 }

5514
5515 // IE change delegation and checkbox/radio fix

5516 if
( !jQuery.support.changeBubbles ) {
5517
5518     jQuery.
event.special.change = {
5519
5520         setup: function() {
5521
5522             
if ( rformElems.test( this.nodeName ) ) {
5523                 
// IE doesn't fire change on a check/radio until blur; trigger it on click
5524                 
// after a propertychange. Eat the blur-change in special.change.handle.
5525                 
// This still fires onchange a second time for check/radio after blur.
5526                 
if ( this.type === "checkbox" || this.type === "radio" ) {
5527                     jQuery.
event.add( this, "propertychange._change", function( event ) {
5528                         
if ( event.originalEvent.propertyName === "checked" ) {
5529                             
this._just_changed = true;
5530                         }
5531                     });
5532                     jQuery.
event.add( this, "click._change", function( event ) {
5533                         
if ( this._just_changed && !event.isTrigger ) {
5534                             
this._just_changed = false;
5535                         }
5536                         
// Allow triggered, simulated change events (#11500)
5537                         jQuery.
event.simulate( "change", this, event, true );
5538                     });
5539                 }
5540                 
return false;
5541             }
5542             
// Delegated event; lazy-add a change handler on descendant inputs
5543             jQuery.
event.add( this, "beforeactivate._change", function( e ) {
5544                 
var elem = e.target;
5545
5546                 
if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
5547                     jQuery.
event.add( elem, "change._change", function( event ) {
5548                         
if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
5549                             jQuery.
event.simulate( "change", this.parentNode, event, true );
5550                         }
5551                     });
5552                     jQuery._data( elem,
"changeBubbles", true );
5553                 }
5554             });
5555         },
5556
5557         handle: function(
event ) {
5558             
var elem = event.target;
5559
5560             
// Swallow native change events from checkbox/radio, we already triggered them above
5561             
if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
5562                 
return event.handleObj.handler.apply( this, arguments );
5563             }
5564         },
5565
5566         teardown: function() {
5567             jQuery.
event.remove( this, "._change" );
5568
5569             
return !rformElems.test( this.nodeName );
5570         }
5571     };
5572 }

5573
5574 // Create
"bubbling" focus and blur events
5575 if
( !jQuery.support.focusinBubbles ) {
5576     jQuery.each({ focus:
"focusin", blur: "focusout" }, function( orig, fix ) {
5577
5578         
// Attach a single capturing handler while someone wants focusin/focusout
5579         
var attaches = 0,
5580             handler = function(
event ) {
5581                 jQuery.
event.simulate( fix, event.target, jQuery.event.fix( event ), true );
5582             };
5583
5584         jQuery.
event.special[ fix ] = {
5585             setup: function() {
5586                 
if ( attaches++ === 0 ) {
5587                     document.addEventListener( orig, handler,
true );
5588                 }
5589             },
5590             teardown: function() {
5591                 
if ( --attaches === 0 ) {
5592                     document.removeEventListener( orig, handler,
true );
5593                 }
5594             }
5595         };
5596     });
5597 }
5598
5599 jQuery.fn.extend({
5600
5601     
on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
5602         
var type, origFn;
5603
5604         
// Types can be a map of types/handlers
5605         
if ( typeof types === "object" ) {
5606             
// ( types-Object, selector, data )
5607             
if ( typeof selector !== "string" ) {
5608                 
// ( types-Object, data )
5609                 data = data || selector;
5610                 selector = undefined;
5611             }
5612             
for ( type in types ) {
5613                 
this.on( type, selector, data, types[ type ], one );
5614             }
5615             
return this;
5616         }
5617
5618         
if ( data == null && fn == null ) {
5619             
// ( types, fn )
5620             fn = selector;
5621             data = selector = undefined;
5622         }
else if ( fn == null ) {
5623             
if ( typeof selector === "string" ) {
5624                 
// ( types, selector, fn )
5625                 fn = data;
5626                 data = undefined;
5627             }
else {
5628                 
// ( types, data, fn )
5629                 fn = data;
5630                 data = selector;
5631                 selector = undefined;
5632             }
5633         }
5634         
if ( fn === false ) {
5635             fn = returnFalse;
5636         }
else if ( !fn ) {
5637             
return this;
5638         }
5639
5640         
if ( one === 1 ) {
5641             origFn = fn;
5642             fn = function(
event ) {
5643                 
// Can use an empty set, since event contains the info
5644                 jQuery().off(
event );
5645                 
return origFn.apply( this, arguments );
5646             };
5647             
// Use same guid so caller can remove using origFn
5648             fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5649         }
5650         
return this.each( function() {
5651             jQuery.
event.add( this, types, fn, data, selector );
5652         });
5653     },
5654     one: function( types, selector, data, fn ) {
5655         
return this.on( types, selector, data, fn, 1 );
5656     },
5657     off: function( types, selector, fn ) {
5658         
var handleObj, type;
5659         
if ( types && types.preventDefault && types.handleObj ) {
5660             
// ( event ) dispatched jQuery.Event
5661             handleObj = types.handleObj;
5662             jQuery( types.delegateTarget ).off(
5663                 handleObj.
namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
5664                 handleObj.selector,
5665                 handleObj.handler
5666             );
5667             
return this;
5668         }
5669         
if ( typeof types === "object" ) {
5670             
// ( types-object [, selector] )
5671             
for ( type in types ) {
5672                 
this.off( type, selector, types[ type ] );
5673             }
5674             
return this;
5675         }
5676         
if ( selector === false || typeof selector === "function" ) {
5677             
// ( types [, fn] )
5678             fn = selector;
5679             selector = undefined;
5680         }
5681         
if ( fn === false ) {
5682             fn = returnFalse;
5683         }
5684         
return this.each(function() {
5685             jQuery.
event.remove( this, types, fn, selector );
5686         });
5687     },
5688
5689     trigger: function( type, data ) {
5690         
return this.each(function() {
5691             jQuery.
event.trigger( type, data, this );
5692         });
5693     },
5694     triggerHandler: function( type, data ) {
5695         
var elem = this[0];
5696         
if ( elem ) {
5697             
return jQuery.event.trigger( type, data, elem, true );
5698         }
5699     }
5700 });

5701 var
isSimple = /^.[^:#\[\.,]*$/,
5702     rparentsprev = /^(?:parents|prev(?:Until|All))/,
5703     rneedsContext = jQuery.expr.match.needsContext,
5704     
// methods guaranteed to produce a unique set when starting from a unique set
5705     guaranteedUnique = {
5706         children:
true,
5707         contents:
true,
5708         next:
true,
5709         prev:
true
5710     };
5711
5712 jQuery.fn.extend({
5713     find: function( selector ) {
5714         
var i,
5715             ret = [],
5716             self =
this,
5717             len = self.length;
5718
5719         
if ( typeof selector !== "string" ) {
5720             
return this.pushStack( jQuery( selector ).filter(function() {
5721                 
for ( i = 0; i < len; i++ ) {
5722                     
if ( jQuery.contains( self[ i ], this ) ) {
5723                         
return true;
5724                     }
5725                 }
5726             }) );
5727         }
5728
5729         
for ( i = 0; i < len; i++ ) {
5730             jQuery.find( selector, self[ i ], ret );
5731         }
5732
5733         
// Needed because $( selector, context ) becomes $( context ).find( selector )
5734         ret =
this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
5735         ret.selector =
this.selector ? this.selector + " " + selector : selector;
5736         
return ret;
5737     },
5738
5739     has: function( target ) {
5740         
var i,
5741             targets = jQuery( target,
this ),
5742             len = targets.length;
5743
5744         
return this.filter(function() {
5745             
for ( i = 0; i < len; i++ ) {
5746                 
if ( jQuery.contains( this, targets[i] ) ) {
5747                     
return true;
5748                 }
5749             }
5750         });
5751     },
5752
5753     not: function( selector ) {
5754         
return this.pushStack( winnow(this, selector || [], true) );
5755     },
5756
5757     filter: function( selector ) {
5758         
return this.pushStack( winnow(this, selector || [], false) );
5759     },
5760
5761     
is: function( selector ) {
5762         
return !!winnow(
5763             
this,
5764
5765             
// If this is a positional/relative selector, check membership in the returned set
5766             
// so $("p:first").is("p:last") won't return true for a doc with two "p".
5767             
typeof selector === "string" && rneedsContext.test( selector ) ?
5768                 jQuery( selector ) :
5769                 selector || [],
5770             
false
5771         ).length;
5772     },
5773
5774     closest: function( selectors, context ) {
5775         
var cur,
5776             i =
0,
5777             l =
this.length,
5778             ret = [],
5779             pos = rneedsContext.test( selectors ) ||
typeof selectors !== "string" ?
5780                 jQuery( selectors, context ||
this.context ) :
5781                 
0;
5782
5783         
for ( ; i < l; i++ ) {
5784             
for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
5785                 
// Always skip document fragments
5786                 
if ( cur.nodeType < 11 && (pos ?
5787                     pos.index(cur) > -
1 :
5788
5789                     
// Don't pass non-elements to Sizzle
5790                     cur.nodeType ===
1 &&
5791                         jQuery.find.matchesSelector(cur, selectors)) ) {
5792
5793                     cur = ret.push( cur );
5794                     
break;
5795                 }
5796             }
5797         }
5798
5799         
return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
5800     },
5801
5802     
// Determine the position of an element within
5803     
// the matched set of elements
5804     index: function( elem ) {
5805
5806         
// No argument, return index in parent
5807         
if ( !elem ) {
5808             
return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
5809         }
5810
5811         
// index in selector
5812         
if ( typeof elem === "string" ) {
5813             
return jQuery.inArray( this[0], jQuery( elem ) );
5814         }
5815
5816         
// Locate the position of the desired element
5817         
return jQuery.inArray(
5818             
// If it receives a jQuery object, the first element is used
5819             elem.jquery ? elem[
0] : elem, this );
5820     },
5821
5822     
add: function( selector, context ) {
5823         
var set = typeof selector === "string" ?
5824                 jQuery( selector, context ) :
5825                 jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5826             all = jQuery.merge(
this.get(), set );
5827
5828         
return this.pushStack( jQuery.unique(all) );
5829     },
5830
5831     addBack: function( selector ) {
5832         
return this.add( selector == null ?
5833             
this.prevObject : this.prevObject.filter(selector)
5834         );
5835     }
5836 });
5837
5838 function sibling( cur, dir ) {
5839     
do {
5840         cur = cur[ dir ];
5841     }
while ( cur && cur.nodeType !== 1 );
5842
5843     
return cur;
5844 }
5845
5846 jQuery.each({
5847     parent: function( elem ) {
5848         
var parent = elem.parentNode;
5849         
return parent && parent.nodeType !== 11 ? parent : null;
5850     },
5851     parents: function( elem ) {
5852         
return jQuery.dir( elem, "parentNode" );
5853     },
5854     parentsUntil: function( elem, i, until ) {
5855         
return jQuery.dir( elem, "parentNode", until );
5856     },
5857     next: function( elem ) {
5858         
return sibling( elem, "nextSibling" );
5859     },
5860     prev: function( elem ) {
5861         
return sibling( elem, "previousSibling" );
5862     },
5863     nextAll: function( elem ) {
5864         
return jQuery.dir( elem, "nextSibling" );
5865     },
5866     prevAll: function( elem ) {
5867         
return jQuery.dir( elem, "previousSibling" );
5868     },
5869     nextUntil: function( elem, i, until ) {
5870         
return jQuery.dir( elem, "nextSibling", until );
5871     },
5872     prevUntil: function( elem, i, until ) {
5873         
return jQuery.dir( elem, "previousSibling", until );
5874     },
5875     siblings: function( elem ) {
5876         
return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
5877     },
5878     children: function( elem ) {
5879         
return jQuery.sibling( elem.firstChild );
5880     },
5881     contents: function( elem ) {
5882         
return jQuery.nodeName( elem, "iframe" ) ?
5883             elem.contentDocument || elem.contentWindow.document :
5884             jQuery.merge( [], elem.childNodes );
5885     }
5886 }, function( name, fn ) {
5887     jQuery.fn[ name ] = function( until, selector ) {
5888         
var ret = jQuery.map( this, fn, until );
5889
5890         
if ( name.slice( -5 ) !== "Until" ) {
5891             selector = until;
5892         }
5893
5894         
if ( selector && typeof selector === "string" ) {
5895             ret = jQuery.filter( selector, ret );
5896         }
5897
5898         
if ( this.length > 1 ) {
5899             
// Remove duplicates
5900             
if ( !guaranteedUnique[ name ] ) {
5901                 ret = jQuery.unique( ret );
5902             }
5903
5904             
// Reverse order for parents* and prev-derivatives
5905             
if ( rparentsprev.test( name ) ) {
5906                 ret = ret.reverse();
5907             }
5908         }
5909
5910         
return this.pushStack( ret );
5911     };
5912 });
5913
5914 jQuery.extend({
5915     filter: function( expr, elems, not ) {
5916         
var elem = elems[ 0 ];
5917
5918         
if ( not ) {
5919             expr =
":not(" + expr + ")";
5920         }
5921
5922         
return elems.length === 1 && elem.nodeType === 1 ?
5923             jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
5924             jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
5925                 
return elem.nodeType === 1;
5926             }));
5927     },
5928
5929     dir: function( elem, dir, until ) {
5930         
var matched = [],
5931             cur = elem[ dir ];
5932
5933         
while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5934             
if ( cur.nodeType === 1 ) {
5935                 matched.push( cur );
5936             }
5937             cur = cur[dir];
5938         }
5939         
return matched;
5940     },
5941
5942     sibling: function( n, elem ) {
5943         
var r = [];
5944
5945         
for ( ; n; n = n.nextSibling ) {
5946             
if ( n.nodeType === 1 && n !== elem ) {
5947                 r.push( n );
5948             }
5949         }
5950
5951         
return r;
5952     }
5953 });

5954
5955 // Implement the identical functionality
for filter and not
5956 function winnow( elements, qualifier, not ) {
5957     
if ( jQuery.isFunction( qualifier ) ) {
5958         
return jQuery.grep( elements, function( elem, i ) {
5959             
/* jshint -W018 */
5960             
return !!qualifier.call( elem, i, elem ) !== not;
5961         });
5962
5963     }
5964
5965     
if ( qualifier.nodeType ) {
5966         
return jQuery.grep( elements, function( elem ) {
5967             
return ( elem === qualifier ) !== not;
5968         });
5969
5970     }
5971
5972     
if ( typeof qualifier === "string" ) {
5973         
if ( isSimple.test( qualifier ) ) {
5974             
return jQuery.filter( qualifier, elements, not );
5975         }
5976
5977         qualifier = jQuery.filter( qualifier, elements );
5978     }
5979
5980     
return jQuery.grep( elements, function( elem ) {
5981         
return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
5982     });
5983 }
5984 function createSafeFragment( document ) {
5985     
var list = nodeNames.split( "|" ),
5986         safeFrag = document.createDocumentFragment();
5987
5988     
if ( safeFrag.createElement ) {
5989         
while ( list.length ) {
5990             safeFrag.createElement(
5991                 list.pop()
5992             );
5993         }
5994     }
5995     
return safeFrag;
5996 }

5997
5998 var
nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5999         
"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
6000     rinlinejQuery = / jQuery\d+=
"(?:null|\d+)"/g,
6001     rnoshimcache =
new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
6002     rleadingWhitespace = /^\s+/,
6003     rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
6004     rtagName = /<([\w:]+)/,
6005     rtbody = /<tbody/i,
6006     rhtml = /<|&#?\w+;/,
6007     rnoInnerhtml = /<(?:script|style|link)/i,
6008     manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
6009     
// checked="checked" or checked
6010     rchecked = /
checked\s*(?:[^=]|=\s*.checked.)/i,
6011     rscriptType = /^$|\/(?:java|ecma)script/i,
6012     rscriptTypeMasked = /^
true\/(.*)/,
6013     rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
6014
6015     
// We have to close these tags to support XHTML (#13200)
6016     wrapMap = {
6017         option: [
1, "<select multiple='multiple'>", "</select>" ],
6018         legend: [
1, "<fieldset>", "</fieldset>" ],
6019         area: [
1, "<map>", "</map>" ],
6020         param: [
1, "<object>", "</object>" ],
6021         thead: [
1, "<table>", "</table>" ],
6022         tr: [
2, "<table><tbody>", "</tbody></table>" ],
6023         col: [
2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
6024         td: [
3, "<table><tbody><tr>", "</tr></tbody></table>" ],
6025
6026         
// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
6027         
// unless wrapped in a div with non-breaking characters in front of it.
6028         _default: jQuery.support.htmlSerialize ? [
0, "", "" ] : [ 1, "X<div>", "</div>" ]
6029     },
6030     safeFragment = createSafeFragment( document ),
6031     fragmentDiv = safeFragment.appendChild( document.createElement(
"div") );
6032
6033 wrapMap.optgroup = wrapMap.option;
6034 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
6035 wrapMap.th = wrapMap.td;
6036
6037 jQuery.fn.extend({
6038     text: function(
value ) {
6039         
return jQuery.access( this, function( value ) {
6040             
return value === undefined ?
6041                 jQuery.text(
this ) :
6042                 
this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
6043         },
null, value, arguments.length );
6044     },
6045
6046     append: function() {
6047         
return this.domManip( arguments, function( elem ) {
6048             
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6049                 
var target = manipulationTarget( this, elem );
6050                 target.appendChild( elem );
6051             }
6052         });
6053     },
6054
6055     prepend: function() {
6056         
return this.domManip( arguments, function( elem ) {
6057             
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6058                 
var target = manipulationTarget( this, elem );
6059                 target.insertBefore( elem, target.firstChild );
6060             }
6061         });
6062     },
6063
6064     before: function() {
6065         
return this.domManip( arguments, function( elem ) {
6066             
if ( this.parentNode ) {
6067                 
this.parentNode.insertBefore( elem, this );
6068             }
6069         });
6070     },
6071
6072     after: function() {
6073         
return this.domManip( arguments, function( elem ) {
6074             
if ( this.parentNode ) {
6075                 
this.parentNode.insertBefore( elem, this.nextSibling );
6076             }
6077         });
6078     },
6079
6080     
// keepData is for internal use only--do not document
6081     
remove: function( selector, keepData ) {
6082         
var elem,
6083             elems = selector ? jQuery.filter( selector,
this ) : this,
6084             i =
0;
6085
6086         
for ( ; (elem = elems[i]) != null; i++ ) {
6087
6088             
if ( !keepData && elem.nodeType === 1 ) {
6089                 jQuery.cleanData( getAll( elem ) );
6090             }
6091
6092             
if ( elem.parentNode ) {
6093                 
if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
6094                     setGlobalEval( getAll( elem,
"script" ) );
6095                 }
6096                 elem.parentNode.removeChild( elem );
6097             }
6098         }
6099
6100         
return this;
6101     },
6102
6103     empty: function() {
6104         
var elem,
6105             i =
0;
6106
6107         
for ( ; (elem = this[i]) != null; i++ ) {
6108             
// Remove element nodes and prevent memory leaks
6109             
if ( elem.nodeType === 1 ) {
6110                 jQuery.cleanData( getAll( elem,
false ) );
6111             }
6112
6113             
// Remove any remaining nodes
6114             
while ( elem.firstChild ) {
6115                 elem.removeChild( elem.firstChild );
6116             }
6117
6118             
// If this is a select, ensure that it displays empty (#12336)
6119             
// Support: IE<9
6120             
if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
6121                 elem.options.length =
0;
6122             }
6123         }
6124
6125         
return this;
6126     },
6127
6128     clone: function( dataAndEvents, deepDataAndEvents ) {
6129         dataAndEvents = dataAndEvents ==
null ? false : dataAndEvents;
6130         deepDataAndEvents = deepDataAndEvents ==
null ? dataAndEvents : deepDataAndEvents;
6131
6132         
return this.map( function () {
6133             
return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6134         });
6135     },
6136
6137     html: function(
value ) {
6138         
return jQuery.access( this, function( value ) {
6139             
var elem = this[0] || {},
6140                 i =
0,
6141                 l =
this.length;
6142
6143             
if ( value === undefined ) {
6144                 
return elem.nodeType === 1 ?
6145                     elem.innerHTML.replace( rinlinejQuery,
"" ) :
6146                     undefined;
6147             }
6148
6149             
// See if we can take a shortcut and just use innerHTML
6150             
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6151                 ( jQuery.support.htmlSerialize || !rnoshimcache.test(
value ) ) &&
6152                 ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test(
value ) ) &&
6153                 !wrapMap[ ( rtagName.exec(
value ) || ["", ""] )[1].toLowerCase() ] ) {
6154
6155                 
value = value.replace( rxhtmlTag, "<$1></$2>" );
6156
6157                 
try {
6158                     
for (; i < l; i++ ) {
6159                         
// Remove element nodes and prevent memory leaks
6160                         elem =
this[i] || {};
6161                         
if ( elem.nodeType === 1 ) {
6162                             jQuery.cleanData( getAll( elem,
false ) );
6163                             elem.innerHTML =
value;
6164                         }
6165                     }
6166
6167                     elem =
0;
6168
6169                 
// If using innerHTML throws an exception, use the fallback method
6170                 }
catch(e) {}
6171             }
6172
6173             
if ( elem ) {
6174                 
this.empty().append( value );
6175             }
6176         },
null, value, arguments.length );
6177     },
6178
6179     replaceWith: function() {
6180         
var
6181             
// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
6182             args = jQuery.map(
this, function( elem ) {
6183                 
return [ elem.nextSibling, elem.parentNode ];
6184             }),
6185             i =
0;
6186
6187         
// Make the changes, replacing each context element with the new content
6188         
this.domManip( arguments, function( elem ) {
6189             
var next = args[ i++ ],
6190                 parent = args[ i++ ];
6191
6192             
if ( parent ) {
6193                 
// Don't use the snapshot next if it has moved (#13810)
6194                 
if ( next && next.parentNode !== parent ) {
6195                     next =
this.nextSibling;
6196                 }
6197                 jQuery(
this ).remove();
6198                 parent.insertBefore( elem, next );
6199             }
6200         
// Allow new content to include elements from the context set
6201         },
true );
6202
6203         
// Force removal if there was no new content (e.g., from empty arguments)
6204         
return i ? this : this.remove();
6205     },
6206
6207     detach: function( selector ) {
6208         
return this.remove( selector, true );
6209     },
6210
6211     domManip: function( args, callback, allowIntersection ) {
6212
6213         
// Flatten any nested arrays
6214         args = core_concat.apply( [], args );
6215
6216         
var first, node, hasScripts,
6217             scripts, doc, fragment,
6218             i =
0,
6219             l =
this.length,
6220             
set = this,
6221             iNoClone = l -
1,
6222             
value = args[0],
6223             isFunction = jQuery.isFunction(
value );
6224
6225         
// We can't cloneNode fragments that contain checked, in WebKit
6226         
if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
6227             
return this.each(function( index ) {
6228                 
var self = set.eq( index );
6229                 
if ( isFunction ) {
6230                     args[
0] = value.call( this, index, self.html() );
6231                 }
6232                 self.domManip( args, callback, allowIntersection );
6233             });
6234         }
6235
6236         
if ( l ) {
6237             fragment = jQuery.buildFragment( args,
this[ 0 ].ownerDocument, false, !allowIntersection && this );
6238             first = fragment.firstChild;
6239
6240             
if ( fragment.childNodes.length === 1 ) {
6241                 fragment = first;
6242             }
6243
6244             
if ( first ) {
6245                 scripts = jQuery.map( getAll( fragment,
"script" ), disableScript );
6246                 hasScripts = scripts.length;
6247
6248                 
// Use the original fragment for the last item instead of the first because it can end up
6249                 
// being emptied incorrectly in certain situations (#8070).
6250                 
for ( ; i < l; i++ ) {
6251                     node = fragment;
6252
6253                     
if ( i !== iNoClone ) {
6254                         node = jQuery.clone( node,
true, true );
6255
6256                         
// Keep references to cloned scripts for later restoration
6257                         
if ( hasScripts ) {
6258                             jQuery.merge( scripts, getAll( node,
"script" ) );
6259                         }
6260                     }
6261
6262                     callback.call(
this[i], node, i );
6263                 }
6264
6265                 
if ( hasScripts ) {
6266                     doc = scripts[ scripts.length -
1 ].ownerDocument;
6267
6268                     
// Reenable scripts
6269                     jQuery.map( scripts, restoreScript );
6270
6271                     
// Evaluate executable scripts on first document insertion
6272                     
for ( i = 0; i < hasScripts; i++ ) {
6273                         node = scripts[ i ];
6274                         
if ( rscriptType.test( node.type || "" ) &&
6275                             !jQuery._data( node,
"globalEval" ) && jQuery.contains( doc, node ) ) {
6276
6277                             
if ( node.src ) {
6278                                 
// Hope ajax is available...
6279                                 jQuery._evalUrl( node.src );
6280                             }
else {
6281                                 jQuery.globalEval( ( node.text || node.textContent || node.innerHTML ||
"" ).replace( rcleanScript, "" ) );
6282                             }
6283                         }
6284                     }
6285                 }
6286
6287                 
// Fix #11809: Avoid leaking memory
6288                 fragment = first =
null;
6289             }
6290         }
6291
6292         
return this;
6293     }
6294 });

6295
6296 // Support: IE<
8
6297 // Manipulating tables requires a tbody

6298 function manipulationTarget( elem, content ) {
6299     
return jQuery.nodeName( elem, "table" ) &&
6300         jQuery.nodeName( content.nodeType ===
1 ? content : content.firstChild, "tr" ) ?
6301
6302         elem.getElementsByTagName(
"tbody")[0] ||
6303             elem.appendChild( elem.ownerDocument.createElement(
"tbody") ) :
6304         elem;
6305 }

6306
6307 // Replace/restore the type attribute of script elements
for safe DOM manipulation
6308 function disableScript( elem ) {
6309     elem.type = (jQuery.find.attr( elem,
"type" ) !== null) + "/" + elem.type;
6310     
return elem;
6311 }
6312 function restoreScript( elem ) {
6313     
var match = rscriptTypeMasked.exec( elem.type );
6314     
if ( match ) {
6315         elem.type = match[
1];
6316     }
else {
6317         elem.removeAttribute(
"type");
6318     }
6319     
return elem;
6320 }

6321
6322 // Mark scripts
as having already been evaluated
6323 function setGlobalEval( elems, refElements ) {
6324     
var elem,
6325         i =
0;
6326     
for ( ; (elem = elems[i]) != null; i++ ) {
6327         jQuery._data( elem,
"globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
6328     }
6329 }
6330
6331 function cloneCopyEvent( src, dest ) {
6332
6333     
if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6334         
return;
6335     }
6336
6337     
var type, i, l,
6338         oldData = jQuery._data( src ),
6339         curData = jQuery._data( dest, oldData ),
6340         events = oldData.events;
6341
6342     
if ( events ) {
6343         delete curData.handle;
6344         curData.events = {};
6345
6346         
for ( type in events ) {
6347             
for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6348                 jQuery.
event.add( dest, type, events[ type ][ i ] );
6349             }
6350         }
6351     }
6352
6353     
// make the cloned public data object a copy from the original
6354     
if ( curData.data ) {
6355         curData.data = jQuery.extend( {}, curData.data );
6356     }
6357 }
6358
6359 function fixCloneNodeIssues( src, dest ) {
6360     
var nodeName, e, data;
6361
6362     
// We do not need to do anything for non-Elements
6363     
if ( dest.nodeType !== 1 ) {
6364         
return;
6365     }
6366
6367     nodeName = dest.nodeName.toLowerCase();
6368
6369     
// IE6-8 copies events bound via attachEvent when using cloneNode.
6370     
if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
6371         data = jQuery._data( dest );
6372
6373         
for ( e in data.events ) {
6374             jQuery.removeEvent( dest, e, data.handle );
6375         }
6376
6377         
// Event data gets referenced instead of copied if the expando gets copied too
6378         dest.removeAttribute( jQuery.expando );
6379     }
6380
6381     
// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
6382     
if ( nodeName === "script" && dest.text !== src.text ) {
6383         disableScript( dest ).text = src.text;
6384         restoreScript( dest );
6385
6386     
// IE6-10 improperly clones children of object elements using classid.
6387     
// IE10 throws NoModificationAllowedError if parent is null, #12132.
6388     }
else if ( nodeName === "object" ) {
6389         
if ( dest.parentNode ) {
6390             dest.outerHTML = src.outerHTML;
6391         }
6392
6393         
// This path appears unavoidable for IE9. When cloning an object
6394         
// element in IE9, the outerHTML strategy above is not sufficient.
6395         
// If the src has innerHTML and the destination does not,
6396         
// copy the src.innerHTML into the dest.innerHTML. #10324
6397         
if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
6398             dest.innerHTML = src.innerHTML;
6399         }
6400
6401     }
else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
6402         
// IE6-8 fails to persist the checked state of a cloned checkbox
6403         
// or radio button. Worse, IE6-7 fail to give the cloned element
6404         
// a checked appearance if the defaultChecked value isn't also set
6405
6406         dest.defaultChecked = dest.
checked = src.checked;
6407
6408         
// IE6-7 get confused and end up setting the value of a cloned
6409         
// checkbox/radio button to an empty string instead of "on"
6410         
if ( dest.value !== src.value ) {
6411             dest.
value = src.value;
6412         }
6413
6414     
// IE6-8 fails to return the selected option to the default selected
6415     
// state when cloning options
6416     }
else if ( nodeName === "option" ) {
6417         dest.defaultSelected = dest.selected = src.defaultSelected;
6418
6419     
// IE6-8 fails to set the defaultValue to the correct value when
6420     
// cloning other types of input fields
6421     }
else if ( nodeName === "input" || nodeName === "textarea" ) {
6422         dest.defaultValue = src.defaultValue;
6423     }
6424 }
6425
6426 jQuery.each({
6427     appendTo:
"append",
6428     prependTo:
"prepend",
6429     insertBefore:
"before",
6430     insertAfter:
"after",
6431     replaceAll:
"replaceWith"
6432 }, function( name, original ) {
6433     jQuery.fn[ name ] = function( selector ) {
6434         
var elems,
6435             i =
0,
6436             ret = [],
6437             insert = jQuery( selector ),
6438             last = insert.length -
1;
6439
6440         
for ( ; i <= last; i++ ) {
6441             elems = i === last ?
this : this.clone(true);
6442             jQuery( insert[i] )[ original ]( elems );
6443
6444             
// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6445             core_push.apply( ret, elems.
get() );
6446         }
6447
6448         
return this.pushStack( ret );
6449     };
6450 });
6451
6452 function getAll( context, tag ) {
6453     
var elems, elem,
6454         i =
0,
6455         found =
typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
6456             
typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
6457             undefined;
6458
6459     
if ( !found ) {
6460         
for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
6461             
if ( !tag || jQuery.nodeName( elem, tag ) ) {
6462                 found.push( elem );
6463             }
else {
6464                 jQuery.merge( found, getAll( elem, tag ) );
6465             }
6466         }
6467     }
6468
6469     
return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
6470         jQuery.merge( [ context ], found ) :
6471         found;
6472 }

6473
6474 // Used
in buildFragment, fixes the defaultChecked property
6475 function fixDefaultChecked( elem ) {
6476     
if ( manipulation_rcheckableType.test( elem.type ) ) {
6477         elem.defaultChecked = elem.
checked;
6478     }
6479 }
6480
6481 jQuery.extend({
6482     clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6483         
var destElements, node, clone, i, srcElements,
6484             inPage = jQuery.contains( elem.ownerDocument, elem );
6485
6486         
if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
6487             clone = elem.cloneNode(
true );
6488
6489         
// IE<=8 does not properly clone detached, unknown element nodes
6490         }
else {
6491             fragmentDiv.innerHTML = elem.outerHTML;
6492             fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
6493         }
6494
6495         
if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6496                 (elem.nodeType ===
1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6497
6498             
// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
6499             destElements = getAll( clone );
6500             srcElements = getAll( elem );
6501
6502             
// Fix all IE cloning issues
6503             
for ( i = 0; (node = srcElements[i]) != null; ++i ) {
6504                 
// Ensure that the destination node is not null; Fixes #9587
6505                 
if ( destElements[i] ) {
6506                     fixCloneNodeIssues( node, destElements[i] );
6507                 }
6508             }
6509         }
6510
6511         
// Copy the events from the original to the clone
6512         
if ( dataAndEvents ) {
6513             
if ( deepDataAndEvents ) {
6514                 srcElements = srcElements || getAll( elem );
6515                 destElements = destElements || getAll( clone );
6516
6517                 
for ( i = 0; (node = srcElements[i]) != null; i++ ) {
6518                     cloneCopyEvent( node, destElements[i] );
6519                 }
6520             }
else {
6521                 cloneCopyEvent( elem, clone );
6522             }
6523         }
6524
6525         
// Preserve script evaluation history
6526         destElements = getAll( clone,
"script" );
6527         
if ( destElements.length > 0 ) {
6528             setGlobalEval( destElements, !inPage && getAll( elem,
"script" ) );
6529         }
6530
6531         destElements = srcElements = node =
null;
6532
6533         
// Return the cloned set
6534         
return clone;
6535     },
6536
6537     buildFragment: function( elems, context, scripts, selection ) {
6538         
var j, elem, contains,
6539             tmp, tag, tbody, wrap,
6540             l = elems.length,
6541
6542             
// Ensure a safe fragment
6543             safe = createSafeFragment( context ),
6544
6545             nodes = [],
6546             i =
0;
6547
6548         
for ( ; i < l; i++ ) {
6549             elem = elems[ i ];
6550
6551             
if ( elem || elem === 0 ) {
6552
6553                 
// Add nodes directly
6554                 
if ( jQuery.type( elem ) === "object" ) {
6555                     jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
6556
6557                 
// Convert non-html into a text node
6558                 }
else if ( !rhtml.test( elem ) ) {
6559                     nodes.push( context.createTextNode( elem ) );
6560
6561                 
// Convert html into DOM nodes
6562                 }
else {
6563                     tmp = tmp || safe.appendChild( context.createElement(
"div") );
6564
6565                     
// Deserialize a standard representation
6566                     tag = ( rtagName.exec( elem ) || [
"", ""] )[1].toLowerCase();
6567                     wrap = wrapMap[ tag ] || wrapMap._default;
6568
6569                     tmp.innerHTML = wrap[
1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
6570
6571                     
// Descend through wrappers to the right content
6572                     j = wrap[
0];
6573                     
while ( j-- ) {
6574                         tmp = tmp.lastChild;
6575                     }
6576
6577                     
// Manually add leading whitespace removed by IE
6578                     
if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6579                         nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[
0] ) );
6580                     }
6581
6582                     
// Remove IE's autoinserted <tbody> from table fragments
6583                     
if ( !jQuery.support.tbody ) {
6584
6585                         
// String was a <table>, *may* have spurious <tbody>
6586                         elem = tag ===
"table" && !rtbody.test( elem ) ?
6587                             tmp.firstChild :
6588
6589                             
// String was a bare <thead> or <tfoot>
6590                             wrap[
1] === "<table>" && !rtbody.test( elem ) ?
6591                                 tmp :
6592                                 
0;
6593
6594                         j = elem && elem.childNodes.length;
6595                         
while ( j-- ) {
6596                             
if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
6597                                 elem.removeChild( tbody );
6598                             }
6599                         }
6600                     }
6601
6602                     jQuery.merge( nodes, tmp.childNodes );
6603
6604                     
// Fix #12392 for WebKit and IE > 9
6605                     tmp.textContent =
"";
6606
6607                     
// Fix #12392 for oldIE
6608                     
while ( tmp.firstChild ) {
6609                         tmp.removeChild( tmp.firstChild );
6610                     }
6611
6612                     
// Remember the top-level container for proper cleanup
6613                     tmp = safe.lastChild;
6614                 }
6615             }
6616         }
6617
6618         
// Fix #11356: Clear elements from fragment
6619         
if ( tmp ) {
6620             safe.removeChild( tmp );
6621         }
6622
6623         
// Reset defaultChecked for any radios and checkboxes
6624         
// about to be appended to the DOM in IE 6/7 (#8060)
6625         
if ( !jQuery.support.appendChecked ) {
6626             jQuery.grep( getAll( nodes,
"input" ), fixDefaultChecked );
6627         }
6628
6629         i =
0;
6630         
while ( (elem = nodes[ i++ ]) ) {
6631
6632             
// #4087 - If origin and destination elements are the same, and this is
6633             
// that element, do not do anything
6634             
if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
6635                 
continue;
6636             }
6637
6638             contains = jQuery.contains( elem.ownerDocument, elem );
6639
6640             
// Append to fragment
6641             tmp = getAll( safe.appendChild( elem ),
"script" );
6642
6643             
// Preserve script evaluation history
6644             
if ( contains ) {
6645                 setGlobalEval( tmp );
6646             }
6647
6648             
// Capture executables
6649             
if ( scripts ) {
6650                 j =
0;
6651                 
while ( (elem = tmp[ j++ ]) ) {
6652                     
if ( rscriptType.test( elem.type || "" ) ) {
6653                         scripts.push( elem );
6654                     }
6655                 }
6656             }
6657         }
6658
6659         tmp =
null;
6660
6661         
return safe;
6662     },
6663
6664     cleanData: function( elems,
/* internal */ acceptData ) {
6665         
var elem, type, id, data,
6666             i =
0,
6667             internalKey = jQuery.expando,
6668             cache = jQuery.cache,
6669             deleteExpando = jQuery.support.deleteExpando,
6670             special = jQuery.
event.special;
6671
6672         
for ( ; (elem = elems[i]) != null; i++ ) {
6673
6674             
if ( acceptData || jQuery.acceptData( elem ) ) {
6675
6676                 id = elem[ internalKey ];
6677                 data = id && cache[ id ];
6678
6679                 
if ( data ) {
6680                     
if ( data.events ) {
6681                         
for ( type in data.events ) {
6682                             
if ( special[ type ] ) {
6683                                 jQuery.
event.remove( elem, type );
6684
6685                             // This
is a shortcut to avoid jQuery.event.remove's overhead
6686                             }
else {
6687                                 jQuery.removeEvent( elem, type, data.handle );
6688                             }
6689                         }
6690                     }
6691
6692                     // Remove cache only
if it was not already removed by jQuery.event.remove
6693                     
if ( cache[ id ] ) {
6694
6695                         delete cache[ id ];
6696
6697                         // IE does not allow us to delete expando properties
from nodes,
6698                         // nor does it have a removeAttribute function
on Document nodes;
6699                         // we must handle all of these cases
6700                         
if ( deleteExpando ) {
6701                             delete elem[ internalKey ];
6702
6703                         }
else if ( typeof elem.removeAttribute !== core_strundefined ) {
6704                             elem.removeAttribute( internalKey );
6705
6706                         }
else {
6707                             elem[ internalKey ] =
null;
6708                         }
6709
6710                         core_deletedIds.push( id );
6711                     }
6712                 }
6713             }
6714         }
6715     },
6716
6717     _evalUrl: function( url ) {
6718         
return jQuery.ajax({
6719             url: url,
6720             type:
"GET",
6721             dataType:
"script",
6722             
async: false,
6723             
global: false,
6724             
"throws": true
6725         });
6726     }
6727 });
6728 jQuery.fn.extend({
6729     wrapAll: function( html ) {
6730         
if ( jQuery.isFunction( html ) ) {
6731             
return this.each(function(i) {
6732                 jQuery(
this).wrapAll( html.call(this, i) );
6733             });
6734         }
6735
6736         
if ( this[0] ) {
6737             // The elements to wrap the target around
6738             
var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
6739
6740             
if ( this[0].parentNode ) {
6741                 wrap.insertBefore(
this[0] );
6742             }
6743
6744             wrap.map(function() {
6745                 
var elem = this;
6746
6747                 
while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
6748                     elem = elem.firstChild;
6749                 }
6750
6751                 
return elem;
6752             }).append(
this );
6753         }
6754
6755         
return this;
6756     },
6757
6758     wrapInner: function( html ) {
6759         
if ( jQuery.isFunction( html ) ) {
6760             
return this.each(function(i) {
6761                 jQuery(
this).wrapInner( html.call(this, i) );
6762             });
6763         }
6764
6765         
return this.each(function() {
6766             
var self = jQuery( this ),
6767                 contents = self.contents();
6768
6769             
if ( contents.length ) {
6770                 contents.wrapAll( html );
6771
6772             }
else {
6773                 self.append( html );
6774             }
6775         });
6776     },
6777
6778     wrap: function( html ) {
6779         
var isFunction = jQuery.isFunction( html );
6780
6781         
return this.each(function(i) {
6782             jQuery(
this ).wrapAll( isFunction ? html.call(this, i) : html );
6783         });
6784     },
6785
6786     unwrap: function() {
6787         
return this.parent().each(function() {
6788             
if ( !jQuery.nodeName( this, "body" ) ) {
6789                 jQuery(
this ).replaceWith( this.childNodes );
6790             }
6791         }).end();
6792     }
6793 });

6794 var
iframe, getStyles, curCSS,
6795     ralpha = /alpha\([^)]*\)/i,
6796     ropacity = /opacity\s*=\s*([^)]*)/,
6797     rposition = /^(top|right|bottom|left)$/,
6798     // swappable
if display is none or starts with table except "table", "table-cell", or "table-caption"
6799     // see here
for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6800     rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6801     rmargin = /^margin/,
6802     rnumsplit =
new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
6803     rnumnonpx =
new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
6804     rrelNum =
new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
6805     elemdisplay = { BODY:
"block" },
6806
6807     cssShow = { position:
"absolute", visibility: "hidden", display: "block" },
6808     cssNormalTransform = {
6809         letterSpacing:
0,
6810         fontWeight:
400
6811     },
6812
6813     cssExpand = [
"Top", "Right", "Bottom", "Left" ],
6814     cssPrefixes = [
"Webkit", "O", "Moz", "ms" ];
6815
6816 //
return a css property mapped to a potentially vendor prefixed property
6817 function vendorPropName( style, name ) {
6818
6819     // shortcut
for names that are not vendor prefixed
6820     
if ( name in style ) {
6821         
return name;
6822     }
6823
6824     // check
for vendor prefixed names
6825     
var capName = name.charAt(0).toUpperCase() + name.slice(1),
6826         origName = name,
6827         i = cssPrefixes.length;
6828
6829     
while ( i-- ) {
6830         name = cssPrefixes[ i ] + capName;
6831         
if ( name in style ) {
6832             
return name;
6833         }
6834     }
6835
6836     
return origName;
6837 }
6838
6839 function isHidden( elem, el ) {
6840     // isHidden might be called
from jQuery#filter function;
6841     //
in that case, element will be second argument
6842     elem = el || elem;
6843     
return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
6844 }
6845
6846 function showHide( elements, show ) {
6847     
var display, elem, hidden,
6848         values = [],
6849         index =
0,
6850         length = elements.length;
6851
6852     
for ( ; index < length; index++ ) {
6853         elem = elements[ index ];
6854         
if ( !elem.style ) {
6855             
continue;
6856         }
6857
6858         values[ index ] = jQuery._data( elem,
"olddisplay" );
6859         display = elem.style.display;
6860         
if ( show ) {
6861             // Reset the inline display of
this element to learn if it is
6862             // being hidden
by cascaded rules or not
6863             
if ( !values[ index ] && display === "none" ) {
6864                 elem.style.display =
"";
6865             }
6866
6867             // Set elements which have been overridden with display: none
6868             //
in a stylesheet to whatever the default browser style is
6869             //
for such an element
6870             
if ( elem.style.display === "" && isHidden( elem ) ) {
6871                 values[ index ] = jQuery._data( elem,
"olddisplay", css_defaultDisplay(elem.nodeName) );
6872             }
6873         }
else {
6874
6875             
if ( !values[ index ] ) {
6876                 hidden = isHidden( elem );
6877
6878                 
if ( display && display !== "none" || !hidden ) {
6879                     jQuery._data( elem,
"olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6880                 }
6881             }
6882         }
6883     }
6884
6885     // Set the display of most of the elements
in a second loop
6886     // to avoid the constant reflow
6887     
for ( index = 0; index < length; index++ ) {
6888         elem = elements[ index ];
6889         
if ( !elem.style ) {
6890             
continue;
6891         }
6892         
if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6893             elem.style.display = show ? values[ index ] ||
"" : "none";
6894         }
6895     }
6896
6897     
return elements;
6898 }
6899
6900 jQuery.fn.extend({
6901     css: function( name,
value ) {
6902         
return jQuery.access( this, function( elem, name, value ) {
6903             
var len, styles,
6904                 map = {},
6905                 i =
0;
6906
6907             
if ( jQuery.isArray( name ) ) {
6908                 styles = getStyles( elem );
6909                 len = name.length;
6910
6911                 
for ( ; i < len; i++ ) {
6912                     map[ name[ i ] ] = jQuery.css( elem, name[ i ],
false, styles );
6913                 }
6914
6915                 
return map;
6916             }
6917
6918             
return value !== undefined ?
6919                 jQuery.style( elem, name,
value ) :
6920                 jQuery.css( elem, name );
6921         }, name,
value, arguments.length > 1 );
6922     },
6923     show: function() {
6924         
return showHide( this, true );
6925     },
6926     hide: function() {
6927         
return showHide( this );
6928     },
6929     toggle: function( state ) {
6930         
if ( typeof state === "boolean" ) {
6931             
return state ? this.show() : this.hide();
6932         }
6933
6934         
return this.each(function() {
6935             
if ( isHidden( this ) ) {
6936                 jQuery(
this ).show();
6937             }
else {
6938                 jQuery(
this ).hide();
6939             }
6940         });
6941     }
6942 });
6943
6944 jQuery.extend({
6945     // Add
in style property hooks for overriding the default
6946     // behavior of getting and setting a style property
6947     cssHooks: {
6948         opacity: {
6949             
get: function( elem, computed ) {
6950                 
if ( computed ) {
6951                     // We should always
get a number back from opacity
6952                     
var ret = curCSS( elem, "opacity" );
6953                     
return ret === "" ? "1" : ret;
6954                 }
6955             }
6956         }
6957     },
6958
6959     // Don
't automatically add "px" to these possibly-unitless properties
6960     cssNumber: {
6961         
"columnCount": true,
6962         
"fillOpacity": true,
6963         
"fontWeight": true,
6964         
"lineHeight": true,
6965         
"opacity": true,
6966         
"order": true,
6967         
"orphans": true,
6968         
"widows": true,
6969         
"zIndex": true,
6970         
"zoom": true
6971     },
6972
6973     // Add
in properties whose names you wish to fix before
6974     // setting or getting the
value
6975     cssProps: {
6976         // normalize
float css property
6977         
"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6978     },
6979
6980     // Get and
set the style property on a DOM Node
6981     style: function( elem, name,
value, extra ) {
6982         // Don
't set styles on text and comment nodes
6983         
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6984             
return;
6985         }
6986
6987         // Make sure that we
're working with the right name
6988         
var ret, type, hooks,
6989             origName = jQuery.camelCase( name ),
6990             style = elem.style;
6991
6992         name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6993
6994         // gets hook
for the prefixed version
6995         // followed
by the unprefixed version
6996         hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6997
6998         // Check
if we're setting a value
6999         
if ( value !== undefined ) {
7000             type =
typeof value;
7001
7002             // convert relative number strings (+= or -=) to relative numbers. #
7345
7003             
if ( type === "string" && (ret = rrelNum.exec( value )) ) {
7004                 
value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
7005                 // Fixes bug #
9237
7006                 type =
"number";
7007             }
7008
7009             // Make sure that NaN and
null values aren't set. See: #7116
7010             
if ( value == null || type === "number" && isNaN( value ) ) {
7011                 
return;
7012             }
7013
7014             // If a number was passed
in, add 'px' to the (except for certain CSS properties)
7015             
if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
7016                 
value += "px";
7017             }
7018
7019             // Fixes #
8908, it can be done more correctly by specifing setters in cssHooks,
7020             // but it would mean to define eight (
for every problematic property) identical functions
7021             
if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
7022                 style[ name ] =
"inherit";
7023             }
7024
7025             // If a hook was provided, use that
value, otherwise just set the specified value
7026             
if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
7027
7028                 // Wrapped to prevent IE
from throwing errors when 'invalid' values are provided
7029                 // Fixes bug #
5509
7030                 
try {
7031                     style[ name ] =
value;
7032                 }
catch(e) {}
7033             }
7034
7035         }
else {
7036             // If a hook was provided
get the non-computed value from there
7037             
if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
7038                 
return ret;
7039             }
7040
7041             // Otherwise just
get the value from the style object
7042             
return style[ name ];
7043         }
7044     },
7045
7046     css: function( elem, name, extra, styles ) {
7047         
var num, val, hooks,
7048             origName = jQuery.camelCase( name );
7049
7050         // Make sure that we
're working with the right name
7051         name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
7052
7053         // gets hook
for the prefixed version
7054         // followed
by the unprefixed version
7055         hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
7056
7057         // If a hook was provided
get the computed value from there
7058         
if ( hooks && "get" in hooks ) {
7059             val = hooks.
get( elem, true, extra );
7060         }
7061
7062         // Otherwise,
if a way to get the computed value exists, use that
7063         
if ( val === undefined ) {
7064             val = curCSS( elem, name, styles );
7065         }
7066
7067         //convert
"normal" to computed value
7068         
if ( val === "normal" && name in cssNormalTransform ) {
7069             val = cssNormalTransform[ name ];
7070         }
7071
7072         // Return, converting to number
if forced or a qualifier was provided and val looks numeric
7073         
if ( extra === "" || extra ) {
7074             num = parseFloat( val );
7075             
return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
7076         }
7077         
return val;
7078     }
7079 });
7080
7081 // NOTE: we
've included the "window" in window.getComputedStyle
7082 // because jsdom
on node.js will break without it.
7083 if
( window.getComputedStyle ) {
7084     getStyles = function( elem ) {
7085         
return window.getComputedStyle( elem, null );
7086     };
7087
7088     curCSS = function( elem, name, _computed ) {
7089         
var width, minWidth, maxWidth,
7090             computed = _computed || getStyles( elem ),
7091
7092             // getPropertyValue
is only needed for .css('filter') in IE9, see #12537
7093             ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
7094             style = elem.style;
7095
7096         
if ( computed ) {
7097
7098             
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
7099                 ret = jQuery.style( elem, name );
7100             }
7101
7102             // A tribute to the
"awesome hack by Dean Edwards"
7103             // Chrome <
17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
7104             // Safari
5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
7105             //
this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
7106             
if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
7107
7108                 // Remember the original values
7109                 width = style.width;
7110                 minWidth = style.minWidth;
7111                 maxWidth = style.maxWidth;
7112
7113                 // Put
in the new values to get a computed value out
7114                 style.minWidth = style.maxWidth = style.width = ret;
7115                 ret = computed.width;
7116
7117                 // Revert the changed values
7118                 style.width = width;
7119                 style.minWidth = minWidth;
7120                 style.maxWidth = maxWidth;
7121             }
7122         }
7123
7124         
return ret;
7125     };
7126 }
else if ( document.documentElement.currentStyle ) {
7127     getStyles = function( elem ) {
7128         
return elem.currentStyle;
7129     };
7130
7131     curCSS = function( elem, name, _computed ) {
7132         
var left, rs, rsLeft,
7133             computed = _computed || getStyles( elem ),
7134             ret = computed ? computed[ name ] : undefined,
7135             style = elem.style;
7136
7137         // Avoid setting ret to empty
string here
7138         // so we don
't default to auto
7139         
if ( ret == null && style && style[ name ] ) {
7140             ret = style[ name ];
7141         }
7142
7143         // From the awesome hack
by Dean Edwards
7144         // http://erik.eae.net/archives/
2007/07/27/18.54.15/#comment-102291
7145
7146         // If we
're not dealing with a regular pixel number
7147         // but a number that has a weird ending, we need to convert it to pixels
7148         // but not position css attributes,
as those are proportional to the parent element instead
7149         // and we can
't measure the parent instead because it might trigger a "stacking dolls" problem
7150         
if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
7151
7152             // Remember the original values
7153             left = style.left;
7154             rs = elem.runtimeStyle;
7155             rsLeft = rs && rs.left;
7156
7157             // Put
in the new values to get a computed value out
7158             
if ( rsLeft ) {
7159                 rs.left = elem.currentStyle.left;
7160             }
7161             style.left = name ===
"fontSize" ? "1em" : ret;
7162             ret = style.pixelLeft +
"px";
7163
7164             // Revert the changed values
7165             style.left = left;
7166             
if ( rsLeft ) {
7167                 rs.left = rsLeft;
7168             }
7169         }
7170
7171         
return ret === "" ? "auto" : ret;
7172     };
7173 }
7174
7175 function setPositiveNumber( elem,
value, subtract ) {
7176     
var matches = rnumsplit.exec( value );
7177     
return matches ?
7178         // Guard against undefined
"subtract", e.g., when used as in cssHooks
7179         Math.max(
0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
7180         
value;
7181 }
7182
7183 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
7184     
var i = extra === ( isBorderBox ? "border" : "content" ) ?
7185         // If we already have the right measurement, avoid augmentation
7186         
4 :
7187         // Otherwise initialize
for horizontal or vertical properties
7188         name ===
"width" ? 1 : 0,
7189
7190         val =
0;
7191
7192     
for ( ; i < 4; i += 2 ) {
7193         // both box models exclude margin, so
add it if we want it
7194         
if ( extra === "margin" ) {
7195             val += jQuery.css( elem, extra + cssExpand[ i ],
true, styles );
7196         }
7197
7198         
if ( isBorderBox ) {
7199             // border-box includes padding, so
remove it if we want content
7200             
if ( extra === "content" ) {
7201                 val -= jQuery.css( elem,
"padding" + cssExpand[ i ], true, styles );
7202             }
7203
7204             // at
this point, extra isn't border nor margin, so remove border
7205             
if ( extra !== "margin" ) {
7206                 val -= jQuery.css( elem,
"border" + cssExpand[ i ] + "Width", true, styles );
7207             }
7208         }
else {
7209             // at
this point, extra isn't content, so add padding
7210             val += jQuery.css( elem,
"padding" + cssExpand[ i ], true, styles );
7211
7212             // at
this point, extra isn't content nor padding, so add border
7213             
if ( extra !== "padding" ) {
7214                 val += jQuery.css( elem,
"border" + cssExpand[ i ] + "Width", true, styles );
7215             }
7216         }
7217     }
7218
7219     
return val;
7220 }
7221
7222 function getWidthOrHeight( elem, name, extra ) {
7223
7224     // Start with offset property, which
is equivalent to the border-box value
7225     
var valueIsBorderBox = true,
7226         val = name ===
"width" ? elem.offsetWidth : elem.offsetHeight,
7227         styles = getStyles( elem ),
7228         isBorderBox = jQuery.support.boxSizing && jQuery.css( elem,
"boxSizing", false, styles ) === "border-box";
7229
7230     // some non-html elements
return undefined for offsetWidth, so check for null/undefined
7231     // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=
649285
7232     // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=
491668
7233     
if ( val <= 0 || val == null ) {
7234         // Fall back to computed then uncomputed css
if necessary
7235         val = curCSS( elem, name, styles );
7236         
if ( val < 0 || val == null ) {
7237             val = elem.style[ name ];
7238         }
7239
7240         // Computed unit
is not pixels. Stop here and return.
7241         
if ( rnumnonpx.test(val) ) {
7242             
return val;
7243         }
7244
7245         // we need the check
for style in case a browser which returns unreliable values
7246         //
for getComputedStyle silently falls back to the reliable elem.style
7247         valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
7248
7249         // Normalize
"", auto, and prepare for extra
7250         val = parseFloat( val ) ||
0;
7251     }
7252
7253     // use the active box-sizing model to
add/subtract irrelevant styles
7254     
return ( val +
7255         augmentWidthOrHeight(
7256             elem,
7257             name,
7258             extra || ( isBorderBox ?
"border" : "content" ),
7259             valueIsBorderBox,
7260             styles
7261         )
7262     ) +
"px";
7263 }
7264
7265 // Try to determine the
default display value of an element
7266 function css_defaultDisplay( nodeName ) {
7267     
var doc = document,
7268         display = elemdisplay[ nodeName ];
7269
7270     
if ( !display ) {
7271         display = actualDisplay( nodeName, doc );
7272
7273         // If the simple way fails, read
from inside an iframe
7274         
if ( display === "none" || !display ) {
7275             // Use the already-created iframe
if possible
7276             iframe = ( iframe ||
7277                 jQuery(
"<iframe frameborder='0' width='0' height='0'/>")
7278                 .css(
"cssText", "display:block !important" )
7279             ).appendTo( doc.documentElement );
7280
7281             // Always write a
new HTML skeleton so Webkit and Firefox don't choke on reuse
7282             doc = ( iframe[
0].contentWindow || iframe[0].contentDocument ).document;
7283             doc.write(
"<!doctype html><html><body>");
7284             doc.close();
7285
7286             display = actualDisplay( nodeName, doc );
7287             iframe.detach();
7288         }
7289
7290         // Store the correct
default display
7291         elemdisplay[ nodeName ] = display;
7292     }
7293
7294     
return display;
7295 }
7296
7297 // Called ONLY
from within css_defaultDisplay
7298 function actualDisplay( name, doc ) {
7299     
var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
7300         display = jQuery.css( elem[
0], "display" );
7301     elem.
remove();
7302     
return display;
7303 }
7304
7305 jQuery.each([
"height", "width" ], function( i, name ) {
7306     jQuery.cssHooks[ name ] = {
7307         
get: function( elem, computed, extra ) {
7308             
if ( computed ) {
7309                 // certain elements can have dimension info
if we invisibly show them
7310                 // however, it must have a current display style that would benefit
from this
7311                 
return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
7312                     jQuery.swap( elem, cssShow, function() {
7313                         
return getWidthOrHeight( elem, name, extra );
7314                     }) :
7315                     getWidthOrHeight( elem, name, extra );
7316             }
7317         },
7318
7319         
set: function( elem, value, extra ) {
7320             
var styles = extra && getStyles( elem );
7321             
return setPositiveNumber( elem, value, extra ?
7322                 augmentWidthOrHeight(
7323                     elem,
7324                     name,
7325                     extra,
7326                     jQuery.support.boxSizing && jQuery.css( elem,
"boxSizing", false, styles ) === "border-box",
7327                     styles
7328                 ) :
0
7329             );
7330         }
7331     };
7332 });

7333
7334 if
( !jQuery.support.opacity ) {
7335     jQuery.cssHooks.opacity = {
7336         
get: function( elem, computed ) {
7337             // IE uses filters
for opacity
7338             
return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
7339                 (
0.01 * parseFloat( RegExp.$1 ) ) + "" :
7340                 computed ?
"1" : "";
7341         },
7342
7343         
set: function( elem, value ) {
7344             
var style = elem.style,
7345                 currentStyle = elem.currentStyle,
7346                 opacity = jQuery.isNumeric(
value ) ? "alpha(opacity=" + value * 100 + ")" : "",
7347                 filter = currentStyle && currentStyle.filter || style.filter ||
"";
7348
7349             // IE has trouble with opacity
if it does not have layout
7350             // Force it
by setting the zoom level
7351             style.zoom =
1;
7352
7353             //
if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
7354             //
if value === "", then remove inline opacity #12685
7355             
if ( ( value >= 1 || value === "" ) &&
7356                     jQuery.trim( filter.replace( ralpha,
"" ) ) === "" &&
7357                     style.removeAttribute ) {
7358
7359                 // Setting style.filter to
null, "" & " " still leave "filter:" in the cssText
7360                 //
if "filter:" is present at all, clearType is disabled, we want to avoid this
7361                 // style.removeAttribute
is IE Only, but so apparently is this code path...
7362                 style.removeAttribute(
"filter" );
7363
7364                 //
if there is no filter style applied in a css rule or unset inline opacity, we are done
7365                 
if ( value === "" || currentStyle && !currentStyle.filter ) {
7366                     
return;
7367                 }
7368             }
7369
7370             // otherwise,
set new filter values
7371             style.filter = ralpha.test( filter ) ?
7372                 filter.replace( ralpha, opacity ) :
7373                 filter +
" " + opacity;
7374         }
7375     };
7376 }
7377
7378 // These hooks cannot be added until DOM ready because the support test
7379 //
for it is not run until after DOM ready
7380 jQuery(function() {
7381     
if ( !jQuery.support.reliableMarginRight ) {
7382         jQuery.cssHooks.marginRight = {
7383             
get: function( elem, computed ) {
7384                 
if ( computed ) {
7385                     // WebKit Bug
13343 - getComputedStyle returns wrong value for margin-right
7386                     // Work around
by temporarily setting element display to inline-block
7387                     
return jQuery.swap( elem, { "display": "inline-block" },
7388                         curCSS, [ elem,
"marginRight" ] );
7389                 }
7390             }
7391         };
7392     }
7393
7394     // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=
29084
7395     // getComputedStyle returns percent
when specified for top/left/bottom/right
7396     // rather than make the css module depend
on the offset module, we just check for it here
7397     
if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
7398         jQuery.each( [
"top", "left" ], function( i, prop ) {
7399             jQuery.cssHooks[ prop ] = {
7400                 
get: function( elem, computed ) {
7401                     
if ( computed ) {
7402                         computed = curCSS( elem, prop );
7403                         //
if curCSS returns percentage, fallback to offset
7404                         
return rnumnonpx.test( computed ) ?
7405                             jQuery( elem ).position()[ prop ] +
"px" :
7406                             computed;
7407                     }
7408                 }
7409             };
7410         });
7411     }
7412
7413 });

7414
7415 if
( jQuery.expr && jQuery.expr.filters ) {
7416     jQuery.expr.filters.hidden = function( elem ) {
7417         // Support: Opera <=
12.12
7418         // Opera reports offsetWidths and offsetHeights less than zero
on some elements
7419         
return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
7420             (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem,
"display" )) === "none");
7421     };
7422
7423     jQuery.expr.filters.visible = function( elem ) {
7424         
return !jQuery.expr.filters.hidden( elem );
7425     };
7426 }
7427
7428 // These hooks are used
by animate to expand properties
7429 jQuery.each({
7430     margin:
"",
7431     padding:
"",
7432     border:
"Width"
7433 }, function( prefix, suffix ) {
7434     jQuery.cssHooks[ prefix + suffix ] = {
7435         expand: function(
value ) {
7436             
var i = 0,
7437                 expanded = {},
7438
7439                 // assumes a single number
if not a string
7440                 parts =
typeof value === "string" ? value.split(" ") : [ value ];
7441
7442             
for ( ; i < 4; i++ ) {
7443                 expanded[ prefix + cssExpand[ i ] + suffix ] =
7444                     parts[ i ] || parts[ i -
2 ] || parts[ 0 ];
7445             }
7446
7447             
return expanded;
7448         }
7449     };
7450
7451     
if ( !rmargin.test( prefix ) ) {
7452         jQuery.cssHooks[ prefix + suffix ].
set = setPositiveNumber;
7453     }
7454 });

7455 var
r20 = /%20/g,
7456     rbracket = /\[\]$/,
7457     rCRLF = /\r?\n/g,
7458     rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
7459     rsubmittable = /^(?:input|
select|textarea|keygen)/i;
7460
7461 jQuery.fn.extend({
7462     serialize: function() {
7463         
return jQuery.param( this.serializeArray() );
7464     },
7465     serializeArray: function() {
7466         
return this.map(function(){
7467             // Can
add propHook for "elements" to filter or add form elements
7468             
var elements = jQuery.prop( this, "elements" );
7469             
return elements ? jQuery.makeArray( elements ) : this;
7470         })
7471         .filter(function(){
7472             
var type = this.type;
7473             // Use .
is(":disabled") so that fieldset[disabled] works
7474             
return this.name && !jQuery( this ).is( ":disabled" ) &&
7475                 rsubmittable.test(
this.nodeName ) && !rsubmitterTypes.test( type ) &&
7476                 (
this.checked || !manipulation_rcheckableType.test( type ) );
7477         })
7478         .map(function( i, elem ){
7479             
var val = jQuery( this ).val();
7480
7481             
return val == null ?
7482                 
null :
7483                 jQuery.isArray( val ) ?
7484                     jQuery.map( val, function( val ){
7485                         
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7486                     }) :
7487                     { name: elem.name,
value: val.replace( rCRLF, "\r\n" ) };
7488         }).
get();
7489     }
7490 });
7491
7492 //Serialize an array of form elements or a
set of
7493 //key/values
into a query string
7494 jQuery.param = function( a, traditional ) {
7495     
var prefix,
7496         s = [],
7497         
add = function( key, value ) {
7498             // If
value is a function, invoke it and return its value
7499             
value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
7500             s[ s.length ] = encodeURIComponent( key ) +
"=" + encodeURIComponent( value );
7501         };
7502
7503     // Set traditional to
true for jQuery <= 1.3.2 behavior.
7504     
if ( traditional === undefined ) {
7505         traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
7506     }
7507
7508     // If an array was passed
in, assume that it is an array of form elements.
7509     
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7510         // Serialize the form elements
7511         jQuery.each( a, function() {
7512             
add( this.name, this.value );
7513         });
7514
7515     }
else {
7516         // If traditional, encode the
"old" way (the way 1.3.2 or older
7517         // did it), otherwise encode
params recursively.
7518         
for ( prefix in a ) {
7519             buildParams( prefix, a[ prefix ], traditional,
add );
7520         }
7521     }
7522
7523     // Return the resulting serialization
7524     
return s.join( "&" ).replace( r20, "+" );
7525 };
7526
7527 function buildParams( prefix, obj, traditional,
add ) {
7528     
var name;
7529
7530     
if ( jQuery.isArray( obj ) ) {
7531         // Serialize array item.
7532         jQuery.each( obj, function( i, v ) {
7533             
if ( traditional || rbracket.test( prefix ) ) {
7534                 // Treat each array item
as a scalar.
7535                 
add( prefix, v );
7536
7537             }
else {
7538                 // Item
is non-scalar (array or object), encode its numeric index.
7539                 buildParams( prefix +
"[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
7540             }
7541         });
7542
7543     }
else if ( !traditional && jQuery.type( obj ) === "object" ) {
7544         // Serialize
object item.
7545         
for ( name in obj ) {
7546             buildParams( prefix +
"[" + name + "]", obj[ name ], traditional, add );
7547         }
7548
7549     }
else {
7550         // Serialize scalar item.
7551         
add( prefix, obj );
7552     }
7553 }
7554 jQuery.each( (
"blur focus focusin focusout load resize scroll unload click dblclick " +
7555     
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
7556     
"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
7557
7558     // Handle
event binding
7559     jQuery.fn[ name ] = function( data, fn ) {
7560         
return arguments.length > 0 ?
7561             
this.on( name, null, data, fn ) :
7562             
this.trigger( name );
7563     };
7564 });
7565
7566 jQuery.fn.extend({
7567     hover: function( fnOver, fnOut ) {
7568         
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
7569     },
7570
7571     bind: function( types, data, fn ) {
7572         
return this.on( types, null, data, fn );
7573     },
7574     unbind: function( types, fn ) {
7575         
return this.off( types, null, fn );
7576     },
7577
7578     
delegate: function( selector, types, data, fn ) {
7579         
return this.on( types, selector, data, fn );
7580     },
7581     undelegate: function( selector, types, fn ) {
7582         // (
namespace ) or ( selector, types [, fn] )
7583         
return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
7584     }
7585 });

7586 var

7587     // Document location
7588     ajaxLocParts,
7589     ajaxLocation,
7590     ajax_nonce = jQuery.now(),
7591
7592     ajax_rquery = /\?/,
7593     rhash = /#.*$/,
7594     rts = /([?&])_=[^&]*/
,
7595     rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
// IE leaves an \r character at EOL
7596     
// #7653, #8125, #8152: local protocol detection
7597     rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
7598     rnoContent = /^(?:GET|HEAD)$/,
7599     rprotocol = /^\/\
//,
7600     rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
7601
7602     
// Keep a copy of the old load method
7603     _load = jQuery.fn.load,
7604
7605     
/* Prefilters
7606      *
1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7607      *
2) These are called:
7608      * - BEFORE asking
for a transport
7609      * - AFTER param serialization (s.data
is a string if s.processData is true)
7610      *
3) key is the dataType
7611      *
4) the catchall symbol "*" can be used
7612      *
5) execution will start with transport dataType and THEN continue down to "*" if needed
7613      */

7614     prefilters = {},
7615
7616     
/* Transports bindings
7617      *
1) key is the dataType
7618      *
2) the catchall symbol "*" can be used
7619      *
3) selection will start with transport dataType and THEN go to "*" if needed
7620      */
7621     transports = {},
7622
7623     // Avoid comment-prolog
char sequence (#10098); must appease lint and evade compression
7624     allTypes =
"*/".concat("*");
7625
7626 // #
8138, IE may throw an exception when accessing
7627 // a field
from window.location if document.domain has been set
7628 try
{
7629     ajaxLocation = location.href;
7630 }
catch( e ) {
7631     
// Use the href attribute of an A element
7632     
// since IE will modify it given document.location
7633     ajaxLocation = document.createElement(
"a" );
7634     ajaxLocation.href =
"";
7635     ajaxLocation = ajaxLocation.href;
7636 }

7637
7638 // Segment location
into parts
7639 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];

7640
7641 // Base
"constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7642 function addToPrefiltersOrTransports( structure ) {
7643
7644     
// dataTypeExpression is optional and defaults to "*"
7645     
return function( dataTypeExpression, func ) {
7646
7647         
if ( typeof dataTypeExpression !== "string" ) {
7648             func = dataTypeExpression;
7649             dataTypeExpression =
"*";
7650         }
7651
7652         
var dataType,
7653             i =
0,
7654             dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
7655
7656         
if ( jQuery.isFunction( func ) ) {
7657             
// For each dataType in the dataTypeExpression
7658             
while ( (dataType = dataTypes[i++]) ) {
7659                 
// Prepend if requested
7660                 
if ( dataType[0] === "+" ) {
7661                     dataType = dataType.slice(
1 ) || "*";
7662                     (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
7663
7664                 
// Otherwise append
7665                 }
else {
7666                     (structure[ dataType ] = structure[ dataType ] || []).push( func );
7667                 }
7668             }
7669         }
7670     };
7671 }

7672
7673 // Base inspection function
for prefilters and transports
7674 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
7675
7676     
var inspected = {},
7677         seekingTransport = ( structure === transports );
7678
7679     function inspect( dataType ) {
7680         
var selected;
7681         inspected[ dataType ] =
true;
7682         jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
7683             
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
7684             
if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
7685                 options.dataTypes.unshift( dataTypeOrTransport );
7686                 inspect( dataTypeOrTransport );
7687                 
return false;
7688             }
else if ( seekingTransport ) {
7689                 
return !( selected = dataTypeOrTransport );
7690             }
7691         });
7692         
return selected;
7693     }
7694
7695     
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
7696 }

7697
7698 // A special extend
for ajax options
7699 // that takes
"flat" options (not to be deep extended)
7700 // Fixes #
9887
7701 function ajaxExtend( target, src ) {
7702     
var deep, key,
7703         flatOptions = jQuery.ajaxSettings.flatOptions || {};
7704
7705     
for ( key in src ) {
7706         
if ( src[ key ] !== undefined ) {
7707             ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
7708         }
7709     }
7710     
if ( deep ) {
7711         jQuery.extend(
true, target, deep );
7712     }
7713
7714     
return target;
7715 }
7716
7717 jQuery.fn.load = function( url,
params, callback ) {
7718     
if ( typeof url !== "string" && _load ) {
7719         
return _load.apply( this, arguments );
7720     }
7721
7722     
var selector, response, type,
7723         self =
this,
7724         off = url.indexOf(
" ");
7725
7726     
if ( off >= 0 ) {
7727         selector = url.slice( off, url.length );
7728         url = url.slice(
0, off );
7729     }
7730
7731     
// If it's a function
7732     
if ( jQuery.isFunction( params ) ) {
7733
7734         
// We assume that it's the callback
7735         callback =
params;
7736         
params = undefined;
7737
7738     
// Otherwise, build a param string
7739     }
else if ( params && typeof params === "object" ) {
7740         type =
"POST";
7741     }
7742
7743     
// If we have elements to modify, make the request
7744     
if ( self.length > 0 ) {
7745         jQuery.ajax({
7746             url: url,
7747
7748             
// if "type" variable is undefined, then "GET" method will be used
7749             type: type,
7750             dataType:
"html",
7751             data:
params
7752         }).done(function( responseText ) {
7753
7754             
// Save response for use in complete callback
7755             response = arguments;
7756
7757             self.html( selector ?
7758
7759                 
// If a selector was specified, locate the right elements in a dummy div
7760                 
// Exclude scripts to avoid IE 'Permission Denied' errors
7761                 jQuery(
"<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
7762
7763                 
// Otherwise use the full result
7764                 responseText );
7765
7766         }).complete( callback && function( jqXHR, status ) {
7767             self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
7768         });
7769     }
7770
7771     
return this;
7772 };

7773
7774 // Attach a bunch of functions
for handling common AJAX events
7775 jQuery.each( [
"ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
7776     jQuery.fn[ type ] = function( fn ){
7777         
return this.on( type, fn );
7778     };
7779 });
7780
7781 jQuery.extend({
7782
7783     
// Counter for holding the number of active queries
7784     active:
0,
7785
7786     
// Last-Modified header cache for next request
7787     lastModified: {},
7788     etag: {},
7789
7790     ajaxSettings: {
7791         url: ajaxLocation,
7792         type:
"GET",
7793         isLocal: rlocalProtocol.test( ajaxLocParts[
1 ] ),
7794         
global: true,
7795         processData:
true,
7796         
async: true,
7797         contentType:
"application/x-www-form-urlencoded; charset=UTF-8",
7798         
/*
7799         timeout:
0,
7800         data:
null,
7801         dataType:
null,
7802         username:
null,
7803         password:
null,
7804         cache:
null,
7805         throws:
false,
7806         traditional:
false,
7807         headers: {},
7808         */

7809
7810         accepts: {
7811             
"*": allTypes,
7812             text:
"text/plain",
7813             html:
"text/html",
7814             xml:
"application/xml, text/xml",
7815             json:
"application/json, text/javascript"
7816         },
7817
7818         contents: {
7819             xml: /xml/,
7820             html: /html/,
7821             json: /json/
7822         },
7823
7824         responseFields: {
7825             xml:
"responseXML",
7826             text:
"responseText",
7827             json:
"responseJSON"
7828         },
7829
7830         
// Data converters
7831         
// Keys separate source (or catchall "*") and destination types with a single space
7832         converters: {
7833
7834             
// Convert anything to text
7835             
"* text": String,
7836
7837             
// Text to html (true = no transformation)
7838             
"text html": true,
7839
7840             
// Evaluate text as a json expression
7841             
"text json": jQuery.parseJSON,
7842
7843             
// Parse text as xml
7844             
"text xml": jQuery.parseXML
7845         },
7846
7847         
// For options that shouldn't be deep extended:
7848         
// you can add your own custom options here if
7849         
// and when you create one that shouldn't be
7850         
// deep extended (see ajaxExtend)
7851         flatOptions: {
7852             url:
true,
7853             context:
true
7854         }
7855     },
7856
7857     
// Creates a full fledged settings object into target
7858     
// with both ajaxSettings and settings fields.
7859     
// If target is omitted, writes into ajaxSettings.
7860     ajaxSetup: function( target, settings ) {
7861         
return settings ?
7862
7863             
// Building a settings object
7864             ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
7865
7866             
// Extending ajaxSettings
7867             ajaxExtend( jQuery.ajaxSettings, target );
7868     },
7869
7870     ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7871     ajaxTransport: addToPrefiltersOrTransports( transports ),
7872
7873     
// Main method
7874     ajax: function( url, options ) {
7875
7876         
// If url is an object, simulate pre-1.5 signature
7877         
if ( typeof url === "object" ) {
7878             options = url;
7879             url = undefined;
7880         }
7881
7882         
// Force options to be an object
7883         options = options || {};
7884
7885         
var // Cross-domain detection vars
7886             parts,
7887             
// Loop variable
7888             i,
7889             
// URL without anti-cache param
7890             cacheURL,
7891             
// Response headers as string
7892             responseHeadersString,
7893             
// timeout handle
7894             timeoutTimer,
7895
7896             
// To know if global events are to be dispatched
7897             fireGlobals,
7898
7899             transport,
7900             
// Response headers
7901             responseHeaders,
7902             
// Create the final options object
7903             s = jQuery.ajaxSetup( {}, options ),
7904             
// Callbacks context
7905             callbackContext = s.context || s,
7906             
// Context for global events is callbackContext if it is a DOM node or jQuery collection
7907             globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
7908                 jQuery( callbackContext ) :
7909                 jQuery.
event,
7910             
// Deferreds
7911             deferred = jQuery.Deferred(),
7912             completeDeferred = jQuery.Callbacks(
"once memory"),
7913             
// Status-dependent callbacks
7914             statusCode = s.statusCode || {},
7915             
// Headers (they are sent all at once)
7916             requestHeaders = {},
7917             requestHeadersNames = {},
7918             
// The jqXHR state
7919             state =
0,
7920             
// Default abort message
7921             strAbort =
"canceled",
7922             
// Fake xhr
7923             jqXHR = {
7924                 readyState:
0,
7925
7926                 
// Builds headers hashtable if needed
7927                 getResponseHeader: function( key ) {
7928                     
var match;
7929                     
if ( state === 2 ) {
7930                         
if ( !responseHeaders ) {
7931                             responseHeaders = {};
7932                             
while ( (match = rheaders.exec( responseHeadersString )) ) {
7933                                 responseHeaders[ match[
1].toLowerCase() ] = match[ 2 ];
7934                             }
7935                         }
7936                         match = responseHeaders[ key.toLowerCase() ];
7937                     }
7938                     
return match == null ? null : match;
7939                 },
7940
7941                 
// Raw string
7942                 getAllResponseHeaders: function() {
7943                     
return state === 2 ? responseHeadersString : null;
7944                 },
7945
7946                 
// Caches the header
7947                 setRequestHeader: function( name,
value ) {
7948                     
var lname = name.toLowerCase();
7949                     
if ( !state ) {
7950                         name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7951                         requestHeaders[ name ] =
value;
7952                     }
7953                     
return this;
7954                 },
7955
7956                 
// Overrides response content-type header
7957                 overrideMimeType: function( type ) {
7958                     
if ( !state ) {
7959                         s.mimeType = type;
7960                     }
7961                     
return this;
7962                 },
7963
7964                 
// Status-dependent callbacks
7965                 statusCode: function( map ) {
7966                     
var code;
7967                     
if ( map ) {
7968                         
if ( state < 2 ) {
7969                             
for ( code in map ) {
7970                                 
// Lazy-add the new callback in a way that preserves old ones
7971                                 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
7972                             }
7973                         }
else {
7974                             
// Execute the appropriate callbacks
7975                             jqXHR.always( map[ jqXHR.status ] );
7976                         }
7977                     }
7978                     
return this;
7979                 },
7980
7981                 
// Cancel the request
7982                 abort: function( statusText ) {
7983                     
var finalText = statusText || strAbort;
7984                     
if ( transport ) {
7985                         transport.abort( finalText );
7986                     }
7987                     done(
0, finalText );
7988                     
return this;
7989                 }
7990             };
7991
7992         
// Attach deferreds
7993         deferred.promise( jqXHR ).complete = completeDeferred.
add;
7994         jqXHR.success = jqXHR.done;
7995         jqXHR.error = jqXHR.fail;
7996
7997         
// Remove hash character (#7531: and string promotion)
7998         
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7999         
// Handle falsy url in the settings object (#10093: consistency with old signature)
8000         
// We also use the url parameter if available
8001         s.url = ( ( url || s.url || ajaxLocation ) +
"" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
8002
8003         
// Alias method option to type as per ticket #12004
8004         s.type = options.method || options.type || s.method || s.type;
8005
8006         
// Extract dataTypes list
8007         s.dataTypes = jQuery.trim( s.dataType ||
"*" ).toLowerCase().match( core_rnotwhite ) || [""];
8008
8009         
// A cross-domain request is in order when we have a protocol:host:port mismatch
8010         
if ( s.crossDomain == null ) {
8011             parts = rurl.exec( s.url.toLowerCase() );
8012             s.crossDomain = !!( parts &&
8013                 ( parts[
1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
8014                     ( parts[
3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
8015                         ( ajaxLocParts[
3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
8016             );
8017         }
8018
8019         
// Convert data if not already a string
8020         
if ( s.data && s.processData && typeof s.data !== "string" ) {
8021             s.data = jQuery.param( s.data, s.traditional );
8022         }
8023
8024         
// Apply prefilters
8025         inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
8026
8027         
// If request was aborted inside a prefilter, stop there
8028         
if ( state === 2 ) {
8029             
return jqXHR;
8030         }
8031
8032         
// We can fire global events as of now if asked to
8033         fireGlobals = s.
global;
8034
8035         
// Watch for a new set of requests
8036         
if ( fireGlobals && jQuery.active++ === 0 ) {
8037             jQuery.
event.trigger("ajaxStart");
8038         }
8039
8040         
// Uppercase the type
8041         s.type = s.type.toUpperCase();
8042
8043         
// Determine if request has content
8044         s.hasContent = !rnoContent.test( s.type );
8045
8046         
// Save the URL in case we're toying with the If-Modified-Since
8047         
// and/or If-None-Match header later on
8048         cacheURL = s.url;
8049
8050         
// More options handling for requests with no content
8051         
if ( !s.hasContent ) {
8052
8053             
// If data is available, append data to url
8054             
if ( s.data ) {
8055                 cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ?
"&" : "?" ) + s.data );
8056                 
// #9682: remove data so that it's not used in an eventual retry
8057                 delete s.data;
8058             }
8059
8060             
// Add anti-cache in url if needed
8061             
if ( s.cache === false ) {
8062                 s.url = rts.test( cacheURL ) ?
8063
8064                     
// If there is already a '_' parameter, set its value
8065                     cacheURL.replace( rts,
"$1_=" + ajax_nonce++ ) :
8066
8067                     
// Otherwise add one to the end
8068                     cacheURL + ( ajax_rquery.test( cacheURL ) ?
"&" : "?" ) + "_=" + ajax_nonce++;
8069             }
8070         }
8071
8072         
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8073         
if ( s.ifModified ) {
8074             
if ( jQuery.lastModified[ cacheURL ] ) {
8075                 jqXHR.setRequestHeader(
"If-Modified-Since", jQuery.lastModified[ cacheURL ] );
8076             }
8077             
if ( jQuery.etag[ cacheURL ] ) {
8078                 jqXHR.setRequestHeader(
"If-None-Match", jQuery.etag[ cacheURL ] );
8079             }
8080         }
8081
8082         
// Set the correct header, if data is being sent
8083         
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
8084             jqXHR.setRequestHeader(
"Content-Type", s.contentType );
8085         }
8086
8087         
// Set the Accepts header for the server, depending on the dataType
8088         jqXHR.setRequestHeader(
8089             
"Accept",
8090             s.dataTypes[
0 ] && s.accepts[ s.dataTypes[0] ] ?
8091                 s.accepts[ s.dataTypes[
0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
8092                 s.accepts[
"*" ]
8093         );
8094
8095         
// Check for headers option
8096         
for ( i in s.headers ) {
8097             jqXHR.setRequestHeader( i, s.headers[ i ] );
8098         }
8099
8100         
// Allow custom headers/mimetypes and early abort
8101         
if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
8102             
// Abort if not done already and return
8103             
return jqXHR.abort();
8104         }
8105
8106         
// aborting is no longer a cancellation
8107         strAbort =
"abort";
8108
8109         
// Install callbacks on deferreds
8110         
for ( i in { success: 1, error: 1, complete: 1 } ) {
8111             jqXHR[ i ]( s[ i ] );
8112         }
8113
8114         
// Get transport
8115         transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
8116
8117         
// If no transport, we auto-abort
8118         
if ( !transport ) {
8119             done( -
1, "No Transport" );
8120         }
else {
8121             jqXHR.readyState =
1;
8122
8123             
// Send global event
8124             
if ( fireGlobals ) {
8125                 globalEventContext.trigger(
"ajaxSend", [ jqXHR, s ] );
8126             }
8127             
// Timeout
8128             
if ( s.async && s.timeout > 0 ) {
8129                 timeoutTimer = setTimeout(function() {
8130                     jqXHR.abort(
"timeout");
8131                 }, s.timeout );
8132             }
8133
8134             
try {
8135                 state =
1;
8136                 transport.send( requestHeaders, done );
8137             }
catch ( e ) {
8138                 
// Propagate exception as error if not done
8139                 
if ( state < 2 ) {
8140                     done( -
1, e );
8141                 
// Simply rethrow otherwise
8142                 }
else {
8143                     
throw e;
8144                 }
8145             }
8146         }
8147
8148         
// Callback for when everything is done
8149         function done( status, nativeStatusText, responses, headers ) {
8150             
var isSuccess, success, error, response, modified,
8151                 statusText = nativeStatusText;
8152
8153             
// Called once
8154             
if ( state === 2 ) {
8155                 
return;
8156             }
8157
8158             
// State is "done" now
8159             state =
2;
8160
8161             
// Clear timeout if it exists
8162             
if ( timeoutTimer ) {
8163                 clearTimeout( timeoutTimer );
8164             }
8165
8166             
// Dereference transport for early garbage collection
8167             
// (no matter how long the jqXHR object will be used)
8168             transport = undefined;
8169
8170             
// Cache response headers
8171             responseHeadersString = headers ||
"";
8172
8173             
// Set readyState
8174             jqXHR.readyState = status >
0 ? 4 : 0;
8175
8176             
// Determine if successful
8177             isSuccess = status >=
200 && status < 300 || status === 304;
8178
8179             
// Get response data
8180             
if ( responses ) {
8181                 response = ajaxHandleResponses( s, jqXHR, responses );
8182             }
8183
8184             
// Convert no matter what (that way responseXXX fields are always set)
8185             response = ajaxConvert( s, response, jqXHR, isSuccess );
8186
8187             
// If successful, handle type chaining
8188             
if ( isSuccess ) {
8189
8190                 
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8191                 
if ( s.ifModified ) {
8192                     modified = jqXHR.getResponseHeader(
"Last-Modified");
8193                     
if ( modified ) {
8194                         jQuery.lastModified[ cacheURL ] = modified;
8195                     }
8196                     modified = jqXHR.getResponseHeader(
"etag");
8197                     
if ( modified ) {
8198                         jQuery.etag[ cacheURL ] = modified;
8199                     }
8200                 }
8201
8202                 
// if no content
8203                 
if ( status === 204 || s.type === "HEAD" ) {
8204                     statusText =
"nocontent";
8205
8206                 
// if not modified
8207                 }
else if ( status === 304 ) {
8208                     statusText =
"notmodified";
8209
8210                 
// If we have data, let's convert it
8211                 }
else {
8212                     statusText = response.state;
8213                     success = response.data;
8214                     error = response.error;
8215                     isSuccess = !error;
8216                 }
8217             }
else {
8218                 
// We extract error from statusText
8219                 
// then normalize statusText and status for non-aborts
8220                 error = statusText;
8221                 
if ( status || !statusText ) {
8222                     statusText =
"error";
8223                     
if ( status < 0 ) {
8224                         status =
0;
8225                     }
8226                 }
8227             }
8228
8229             
// Set data for the fake xhr object
8230             jqXHR.status = status;
8231             jqXHR.statusText = ( nativeStatusText || statusText ) +
"";
8232
8233             
// Success/Error
8234             
if ( isSuccess ) {
8235                 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
8236             }
else {
8237                 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
8238             }
8239
8240             
// Status-dependent callbacks
8241             jqXHR.statusCode( statusCode );
8242             statusCode = undefined;
8243
8244             
if ( fireGlobals ) {
8245                 globalEventContext.trigger( isSuccess ?
"ajaxSuccess" : "ajaxError",
8246                     [ jqXHR, s, isSuccess ? success : error ] );
8247             }
8248
8249             
// Complete
8250             completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
8251
8252             
if ( fireGlobals ) {
8253                 globalEventContext.trigger(
"ajaxComplete", [ jqXHR, s ] );
8254                 
// Handle the global AJAX counter
8255                 
if ( !( --jQuery.active ) ) {
8256                     jQuery.
event.trigger("ajaxStop");
8257                 }
8258             }
8259         }
8260
8261         
return jqXHR;
8262     },
8263
8264     getJSON: function( url, data, callback ) {
8265         
return jQuery.get( url, data, callback, "json" );
8266     },
8267
8268     getScript: function( url, callback ) {
8269         
return jQuery.get( url, undefined, callback, "script" );
8270     }
8271 });
8272
8273 jQuery.each( [
"get", "post" ], function( i, method ) {
8274     jQuery[ method ] = function( url, data, callback, type ) {
8275         
// shift arguments if data argument was omitted
8276         
if ( jQuery.isFunction( data ) ) {
8277             type = type || callback;
8278             callback = data;
8279             data = undefined;
8280         }
8281
8282         
return jQuery.ajax({
8283             url: url,
8284             type: method,
8285             dataType: type,
8286             data: data,
8287             success: callback
8288         });
8289     };
8290 });

8291
8292 /* Handles responses to an ajax request:
8293  * - finds the right dataType (mediates between content-type and expected dataType)
8294  * - returns the corresponding response
8295  */

8296 function ajaxHandleResponses( s, jqXHR, responses ) {
8297     
var firstDataType, ct, finalDataType, type,
8298         contents = s.contents,
8299         dataTypes = s.dataTypes;
8300
8301     
// Remove auto dataType and get content-type in the process
8302     
while( dataTypes[ 0 ] === "*" ) {
8303         dataTypes.shift();
8304         
if ( ct === undefined ) {
8305             ct = s.mimeType || jqXHR.getResponseHeader(
"Content-Type");
8306         }
8307     }
8308
8309     
// Check if we're dealing with a known content-type
8310     
if ( ct ) {
8311         
for ( type in contents ) {
8312             
if ( contents[ type ] && contents[ type ].test( ct ) ) {
8313                 dataTypes.unshift( type );
8314                 
break;
8315             }
8316         }
8317     }
8318
8319     
// Check to see if we have a response for the expected dataType
8320     
if ( dataTypes[ 0 ] in responses ) {
8321         finalDataType = dataTypes[
0 ];
8322     }
else {
8323         
// Try convertible dataTypes
8324         
for ( type in responses ) {
8325             
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8326                 finalDataType = type;
8327                 
break;
8328             }
8329             
if ( !firstDataType ) {
8330                 firstDataType = type;
8331             }
8332         }
8333         
// Or just use first one
8334         finalDataType = finalDataType || firstDataType;
8335     }
8336
8337     
// If we found a dataType
8338     
// We add the dataType to the list if needed
8339     
// and return the corresponding response
8340     
if ( finalDataType ) {
8341         
if ( finalDataType !== dataTypes[ 0 ] ) {
8342             dataTypes.unshift( finalDataType );
8343         }
8344         
return responses[ finalDataType ];
8345     }
8346 }

8347
8348 /* Chain conversions given the request and the original response
8349  * Also sets the responseXXX fields
on the jqXHR instance
8350  */

8351 function ajaxConvert( s, response, jqXHR, isSuccess ) {
8352     
var conv2, current, conv, tmp, prev,
8353         converters = {},
8354         
// Work with a copy of dataTypes in case we need to modify it for conversion
8355         dataTypes = s.dataTypes.slice();
8356
8357     
// Create converters map with lowercased keys
8358     
if ( dataTypes[ 1 ] ) {
8359         
for ( conv in s.converters ) {
8360             converters[ conv.toLowerCase() ] = s.converters[ conv ];
8361         }
8362     }
8363
8364     current = dataTypes.shift();
8365
8366     
// Convert to each sequential dataType
8367     
while ( current ) {
8368
8369         
if ( s.responseFields[ current ] ) {
8370             jqXHR[ s.responseFields[ current ] ] = response;
8371         }
8372
8373         
// Apply the dataFilter if provided
8374         
if ( !prev && isSuccess && s.dataFilter ) {
8375             response = s.dataFilter( response, s.dataType );
8376         }
8377
8378         prev = current;
8379         current = dataTypes.shift();
8380
8381         
if ( current ) {
8382
8383             
// There's only work to do if current dataType is non-auto
8384             
if ( current === "*" ) {
8385
8386                 current = prev;
8387
8388             
// Convert response if prev dataType is non-auto and differs from current
8389             }
else if ( prev !== "*" && prev !== current ) {
8390
8391                 
// Seek a direct converter
8392                 conv = converters[ prev +
" " + current ] || converters[ "* " + current ];
8393
8394                 
// If none found, seek a pair
8395                 
if ( !conv ) {
8396                     
for ( conv2 in converters ) {
8397
8398                         
// If conv2 outputs current
8399                         tmp = conv2.split(
" " );
8400                         
if ( tmp[ 1 ] === current ) {
8401
8402                             
// If prev can be converted to accepted input
8403                             conv = converters[ prev +
" " + tmp[ 0 ] ] ||
8404                                 converters[
"* " + tmp[ 0 ] ];
8405                             
if ( conv ) {
8406                                 
// Condense equivalence converters
8407                                 
if ( conv === true ) {
8408                                     conv = converters[ conv2 ];
8409
8410                                 
// Otherwise, insert the intermediate dataType
8411                                 }
else if ( converters[ conv2 ] !== true ) {
8412                                     current = tmp[
0 ];
8413                                     dataTypes.unshift( tmp[
1 ] );
8414                                 }
8415                                 
break;
8416                             }
8417                         }
8418                     }
8419                 }
8420
8421                 
// Apply converter (if not an equivalence)
8422                 
if ( conv !== true ) {
8423
8424                     
// Unless errors are allowed to bubble, catch and return them
8425                     
if ( conv && s[ "throws" ] ) {
8426                         response = conv( response );
8427                     }
else {
8428                         
try {
8429                             response = conv( response );
8430                         }
catch ( e ) {
8431                             
return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
8432                         }
8433                     }
8434                 }
8435             }
8436         }
8437     }
8438
8439     
return { state: "success", data: response };
8440 }

8441 // Install script dataType

8442 jQuery.ajaxSetup({
8443     accepts: {
8444         script:
"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8445     },
8446     contents: {
8447         script: /(?:java|ecma)script/
8448     },
8449     converters: {
8450         
"text script": function( text ) {
8451             jQuery.globalEval( text );
8452             
return text;
8453         }
8454     }
8455 });

8456
8457 // Handle cache
's special case and global
8458 jQuery.ajaxPrefilter(
"script", function( s ) {
8459     
if ( s.cache === undefined ) {
8460         s.cache =
false;
8461     }
8462     
if ( s.crossDomain ) {
8463         s.type =
"GET";
8464         s.
global = false;
8465     }
8466 });

8467
8468 // Bind script tag hack transport

8469 jQuery.ajaxTransport(
"script", function(s) {
8470
8471     
// This transport only deals with cross domain requests
8472     
if ( s.crossDomain ) {
8473
8474         
var script,
8475             head = document.head || jQuery(
"head")[0] || document.documentElement;
8476
8477         
return {
8478
8479             send: function( _, callback ) {
8480
8481                 script = document.createElement(
"script");
8482
8483                 script.
async = true;
8484
8485                 
if ( s.scriptCharset ) {
8486                     script.charset = s.scriptCharset;
8487                 }
8488
8489                 script.src = s.url;
8490
8491                 
// Attach handlers for all browsers
8492                 script.onload = script.onreadystatechange = function( _, isAbort ) {
8493
8494                     
if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8495
8496                         
// Handle memory leak in IE
8497                         script.onload = script.onreadystatechange =
null;
8498
8499                         
// Remove the script
8500                         
if ( script.parentNode ) {
8501                             script.parentNode.removeChild( script );
8502                         }
8503
8504                         
// Dereference the script
8505                         script =
null;
8506
8507                         
// Callback if not abort
8508                         
if ( !isAbort ) {
8509                             callback(
200, "success" );
8510                         }
8511                     }
8512                 };
8513
8514                 
// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
8515                 
// Use native DOM manipulation to avoid our domManip AJAX trickery
8516                 head.insertBefore( script, head.firstChild );
8517             },
8518
8519             abort: function() {
8520                 
if ( script ) {
8521                     script.onload( undefined,
true );
8522                 }
8523             }
8524         };
8525     }
8526 });

8527 var
oldCallbacks = [],
8528     rjsonp = /(=)\?(?=&|$)|\?\?/;

8529
8530 // Default jsonp settings

8531 jQuery.ajaxSetup({
8532     jsonp:
"callback",
8533     jsonpCallback: function() {
8534         
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
8535         
this[ callback ] = true;
8536         
return callback;
8537     }
8538 });

8539
8540 // Detect, normalize options and install callbacks
for jsonp requests
8541 jQuery.ajaxPrefilter(
"json jsonp", function( s, originalSettings, jqXHR ) {
8542
8543     
var callbackName, overwritten, responseContainer,
8544         jsonProp = s.jsonp !==
false && ( rjsonp.test( s.url ) ?
8545             
"url" :
8546             
typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
8547         );
8548
8549     
// Handle iff the expected data type is "jsonp" or we have a parameter to set
8550     
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
8551
8552         
// Get callback name, remembering preexisting value associated with it
8553         callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
8554             s.jsonpCallback() :
8555             s.jsonpCallback;
8556
8557         
// Insert callback into url or form data
8558         
if ( jsonProp ) {
8559             s[ jsonProp ] = s[ jsonProp ].replace( rjsonp,
"$1" + callbackName );
8560         }
else if ( s.jsonp !== false ) {
8561             s.url += ( ajax_rquery.test( s.url ) ?
"&" : "?" ) + s.jsonp + "=" + callbackName;
8562         }
8563
8564         
// Use data converter to retrieve json after script execution
8565         s.converters[
"script json"] = function() {
8566             
if ( !responseContainer ) {
8567                 jQuery.error( callbackName +
" was not called" );
8568             }
8569             
return responseContainer[ 0 ];
8570         };
8571
8572         
// force json dataType
8573         s.dataTypes[
0 ] = "json";
8574
8575         
// Install callback
8576         overwritten = window[ callbackName ];
8577         window[ callbackName ] = function() {
8578             responseContainer = arguments;
8579         };
8580
8581         
// Clean-up function (fires after converters)
8582         jqXHR.always(function() {
8583             
// Restore preexisting value
8584             window[ callbackName ] = overwritten;
8585
8586             
// Save back as free
8587             
if ( s[ callbackName ] ) {
8588                 
// make sure that re-using the options doesn't screw things around
8589                 s.jsonpCallback = originalSettings.jsonpCallback;
8590
8591                 
// save the callback name for future use
8592                 oldCallbacks.push( callbackName );
8593             }
8594
8595             
// Call if it was a function and we have a response
8596             
if ( responseContainer && jQuery.isFunction( overwritten ) ) {
8597                 overwritten( responseContainer[
0 ] );
8598             }
8599
8600             responseContainer = overwritten = undefined;
8601         });
8602
8603         
// Delegate to script
8604         
return "script";
8605     }
8606 });

8607 var
xhrCallbacks, xhrSupported,
8608     xhrId =
0,
8609     
// #5280: Internet Explorer will keep connections alive if we don't abort on unload
8610     xhrOnUnloadAbort = window.ActiveXObject && function() {
8611         
// Abort all pending requests
8612         
var key;
8613         
for ( key in xhrCallbacks ) {
8614             xhrCallbacks[ key ]( undefined,
true );
8615         }
8616     };

8617
8618 // Functions to create xhrs

8619 function createStandardXHR() {
8620     
try {
8621         
return new window.XMLHttpRequest();
8622     }
catch( e ) {}
8623 }
8624
8625 function createActiveXHR() {
8626     
try {
8627         
return new window.ActiveXObject("Microsoft.XMLHTTP");
8628     }
catch( e ) {}
8629 }

8630
8631 // Create the request
object
8632 // (This
is still attached to ajaxSettings for backward compatibility)
8633 jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8634     
/* Microsoft failed to properly
8635      * implement the XMLHttpRequest
in IE7 (can't request local files),
8636      * so we use the ActiveXObject
when it is available
8637      * Additionally XMLHttpRequest can be disabled
in IE7/IE8 so
8638      * we need a fallback.
8639      */

8640     function() {
8641         
return !this.isLocal && createStandardXHR() || createActiveXHR();
8642     } :
8643     
// For all other browsers, use the standard XMLHttpRequest object
8644     createStandardXHR;

8645
8646 // Determine support properties

8647 xhrSupported = jQuery.ajaxSettings.xhr();
8648 jQuery.support.cors = !!xhrSupported && (
"withCredentials" in xhrSupported );
8649 xhrSupported = jQuery.support.ajax = !!xhrSupported;

8650
8651 // Create transport
if the browser can provide an xhr
8652 if
( xhrSupported ) {
8653
8654     jQuery.ajaxTransport(function( s ) {
8655         
// Cross domain only allowed if supported through XMLHttpRequest
8656         
if ( !s.crossDomain || jQuery.support.cors ) {
8657
8658             
var callback;
8659
8660             
return {
8661                 send: function( headers, complete ) {
8662
8663                     
// Get a new xhr
8664                     
var handle, i,
8665                         xhr = s.xhr();
8666
8667                     
// Open the socket
8668                     
// Passing null username, generates a login popup on Opera (#2865)
8669                     
if ( s.username ) {
8670                         xhr.open( s.type, s.url, s.
async, s.username, s.password );
8671                     }
else {
8672                         xhr.open( s.type, s.url, s.
async );
8673                     }
8674
8675                     
// Apply custom fields if provided
8676                     
if ( s.xhrFields ) {
8677                         
for ( i in s.xhrFields ) {
8678                             xhr[ i ] = s.xhrFields[ i ];
8679                         }
8680                     }
8681
8682                     
// Override mime type if needed
8683                     
if ( s.mimeType && xhr.overrideMimeType ) {
8684                         xhr.overrideMimeType( s.mimeType );
8685                     }
8686
8687                     
// X-Requested-With header
8688                     
// For cross-domain requests, seeing as conditions for a preflight are
8689                     
// akin to a jigsaw puzzle, we simply never set it to be sure.
8690                     
// (it can always be set on a per-request basis or even using ajaxSetup)
8691                     
// For same-domain requests, won't change header if already provided.
8692                     
if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8693                         headers[
"X-Requested-With"] = "XMLHttpRequest";
8694                     }
8695
8696                     
// Need an extra try/catch for cross domain requests in Firefox 3
8697                     
try {
8698                         
for ( i in headers ) {
8699                             xhr.setRequestHeader( i, headers[ i ] );
8700                         }
8701                     }
catch( err ) {}
8702
8703                     
// Do send the request
8704                     
// This may raise an exception which is actually
8705                     
// handled in jQuery.ajax (so no try/catch here)
8706                     xhr.send( ( s.hasContent && s.data ) ||
null );
8707
8708                     
// Listener
8709                     callback = function( _, isAbort ) {
8710                         
var status, responseHeaders, statusText, responses;
8711
8712                         
// Firefox throws exceptions when accessing properties
8713                         
// of an xhr when a network error occurred
8714                         
// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8715                         
try {
8716
8717                             
// Was never called and is aborted or complete
8718                             
if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8719
8720                                 
// Only called once
8721                                 callback = undefined;
8722
8723                                 
// Do not keep as active anymore
8724                                 
if ( handle ) {
8725                                     xhr.onreadystatechange = jQuery.noop;
8726                                     
if ( xhrOnUnloadAbort ) {
8727                                         delete xhrCallbacks[ handle ];
8728                                     }
8729                                 }
8730
8731                                 
// If it's an abort
8732                                 
if ( isAbort ) {
8733                                     
// Abort it manually if needed
8734                                     
if ( xhr.readyState !== 4 ) {
8735                                         xhr.abort();
8736                                     }
8737                                 }
else {
8738                                     responses = {};
8739                                     status = xhr.status;
8740                                     responseHeaders = xhr.getAllResponseHeaders();
8741
8742                                     
// When requesting binary data, IE6-9 will throw an exception
8743                                     
// on any attempt to access responseText (#11426)
8744                                     
if ( typeof xhr.responseText === "string" ) {
8745                                         responses.text = xhr.responseText;
8746                                     }
8747
8748                                     
// Firefox throws an exception when accessing
8749                                     
// statusText for faulty cross-domain requests
8750                                     
try {
8751                                         statusText = xhr.statusText;
8752                                     }
catch( e ) {
8753                                         
// We normalize with Webkit giving an empty statusText
8754                                         statusText =
"";
8755                                     }
8756
8757                                     
// Filter status for non standard behaviors
8758
8759                                     
// If the request is local and we have data: assume a success
8760                                     
// (success with no data won't get notified, that's the best we
8761                                     
// can do given current implementations)
8762                                     
if ( !status && s.isLocal && !s.crossDomain ) {
8763                                         status = responses.text ?
200 : 404;
8764                                     
// IE - #1450: sometimes returns 1223 when it should be 204
8765                                     }
else if ( status === 1223 ) {
8766                                         status =
204;
8767                                     }
8768                                 }
8769                             }
8770                         }
catch( firefoxAccessException ) {
8771                             
if ( !isAbort ) {
8772                                 complete( -
1, firefoxAccessException );
8773                             }
8774                         }
8775
8776                         
// Call complete if needed
8777                         
if ( responses ) {
8778                             complete( status, statusText, responses, responseHeaders );
8779                         }
8780                     };
8781
8782                     
if ( !s.async ) {
8783                         
// if we're in sync mode we fire the callback
8784                         callback();
8785                     }
else if ( xhr.readyState === 4 ) {
8786                         
// (IE6 & IE7) if it's in cache and has been
8787                         
// retrieved directly we need to fire the callback
8788                         setTimeout( callback );
8789                     }
else {
8790                         handle = ++xhrId;
8791                         
if ( xhrOnUnloadAbort ) {
8792                             
// Create the active xhrs callbacks list if needed
8793                             
// and attach the unload handler
8794                             
if ( !xhrCallbacks ) {
8795                                 xhrCallbacks = {};
8796                                 jQuery( window ).unload( xhrOnUnloadAbort );
8797                             }
8798                             
// Add to list of active xhrs callbacks
8799                             xhrCallbacks[ handle ] = callback;
8800                         }
8801                         xhr.onreadystatechange = callback;
8802                     }
8803                 },
8804
8805                 abort: function() {
8806                     
if ( callback ) {
8807                         callback( undefined,
true );
8808                     }
8809                 }
8810             };
8811         }
8812     });
8813 }

8814 var
fxNow, timerId,
8815     rfxtypes = /^(?:toggle|show|hide)$/,
8816     rfxnum =
new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
8817     rrun = /queueHooks$/,
8818     animationPrefilters = [ defaultPrefilter ],
8819     tweeners = {
8820         
"*": [function( prop, value ) {
8821             
var tween = this.createTween( prop, value ),
8822                 target = tween.cur(),
8823                 parts = rfxnum.exec(
value ),
8824                 unit = parts && parts[
3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
8825
8826                 
// Starting value computation is required for potential unit mismatches
8827                 start = ( jQuery.cssNumber[ prop ] || unit !==
"px" && +target ) &&
8828                     rfxnum.exec( jQuery.css( tween.elem, prop ) ),
8829                 scale =
1,
8830                 maxIterations =
20;
8831
8832             
if ( start && start[ 3 ] !== unit ) {
8833                 
// Trust units reported by jQuery.css
8834                 unit = unit || start[
3 ];
8835
8836                 
// Make sure we update the tween properties later on
8837                 parts = parts || [];
8838
8839                 
// Iteratively approximate from a nonzero starting point
8840                 start = +target ||
1;
8841
8842                 
do {
8843                     
// If previous iteration zeroed out, double until we get *something*
8844                     
// Use a string for doubling factor so we don't accidentally see scale as unchanged below
8845                     scale = scale ||
".5";
8846
8847                     
// Adjust and apply
8848                     start = start / scale;
8849                     jQuery.style( tween.elem, prop, start + unit );
8850
8851                 
// Update scale, tolerating zero or NaN from tween.cur()
8852                 
// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
8853                 }
while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
8854             }
8855
8856             
// Update tween properties
8857             
if ( parts ) {
8858                 start = tween.start = +start || +target ||
0;
8859                 tween.unit = unit;
8860                 
// If a +=/-= token was provided, we're doing a relative animation
8861                 tween.end = parts[
1 ] ?
8862                     start + ( parts[
1 ] + 1 ) * parts[ 2 ] :
8863                     +parts[
2 ];
8864             }
8865
8866             
return tween;
8867         }]
8868     };

8869
8870 // Animations created synchronously will run synchronously

8871 function createFxNow() {
8872     setTimeout(function() {
8873         fxNow = undefined;
8874     });
8875     
return ( fxNow = jQuery.now() );
8876 }
8877
8878 function createTween(
value, prop, animation ) {
8879     
var tween,
8880         collection = ( tweeners[ prop ] || [] ).concat( tweeners[
"*" ] ),
8881         index =
0,
8882         length = collection.length;
8883     
for ( ; index < length; index++ ) {
8884         
if ( (tween = collection[ index ].call( animation, prop, value )) ) {
8885
8886             
// we're done with this property
8887             
return tween;
8888         }
8889     }
8890 }
8891
8892 function Animation( elem, properties, options ) {
8893     
var result,
8894         stopped,
8895         index =
0,
8896         length = animationPrefilters.length,
8897         deferred = jQuery.Deferred().always( function() {
8898             
// don't match elem in the :animated selector
8899             delete tick.elem;
8900         }),
8901         tick = function() {
8902             
if ( stopped ) {
8903                 
return false;
8904             }
8905             
var currentTime = fxNow || createFxNow(),
8906                 remaining = Math.max(
0, animation.startTime + animation.duration - currentTime ),
8907                 
// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
8908                 temp = remaining / animation.duration ||
0,
8909                 percent =
1 - temp,
8910                 index =
0,
8911                 length = animation.tweens.length;
8912
8913             
for ( ; index < length ; index++ ) {
8914                 animation.tweens[ index ].run( percent );
8915             }
8916
8917             deferred.notifyWith( elem, [ animation, percent, remaining ]);
8918
8919             
if ( percent < 1 && length ) {
8920                 
return remaining;
8921             }
else {
8922                 deferred.resolveWith( elem, [ animation ] );
8923                 
return false;
8924             }
8925         },
8926         animation = deferred.promise({
8927             elem: elem,
8928             props: jQuery.extend( {}, properties ),
8929             opts: jQuery.extend(
true, { specialEasing: {} }, options ),
8930             originalProperties: properties,
8931             originalOptions: options,
8932             startTime: fxNow || createFxNow(),
8933             duration: options.duration,
8934             tweens: [],
8935             createTween: function( prop, end ) {
8936                 
var tween = jQuery.Tween( elem, animation.opts, prop, end,
8937                         animation.opts.specialEasing[ prop ] || animation.opts.easing );
8938                 animation.tweens.push( tween );
8939                 
return tween;
8940             },
8941             stop: function( gotoEnd ) {
8942                 
var index = 0,
8943                     
// if we are going to the end, we want to run all the tweens
8944                     
// otherwise we skip this part
8945                     length = gotoEnd ? animation.tweens.length :
0;
8946                 
if ( stopped ) {
8947                     
return this;
8948                 }
8949                 stopped =
true;
8950                 
for ( ; index < length ; index++ ) {
8951                     animation.tweens[ index ].run(
1 );
8952                 }
8953
8954                 
// resolve when we played the last frame
8955                 
// otherwise, reject
8956                 
if ( gotoEnd ) {
8957                     deferred.resolveWith( elem, [ animation, gotoEnd ] );
8958                 }
else {
8959                     deferred.rejectWith( elem, [ animation, gotoEnd ] );
8960                 }
8961                 
return this;
8962             }
8963         }),
8964         props = animation.props;
8965
8966     propFilter( props, animation.opts.specialEasing );
8967
8968     
for ( ; index < length ; index++ ) {
8969         result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
8970         
if ( result ) {
8971             
return result;
8972         }
8973     }
8974
8975     jQuery.map( props, createTween, animation );
8976
8977     
if ( jQuery.isFunction( animation.opts.start ) ) {
8978         animation.opts.start.call( elem, animation );
8979     }
8980
8981     jQuery.fx.timer(
8982         jQuery.extend( tick, {
8983             elem: elem,
8984             anim: animation,
8985             queue: animation.opts.queue
8986         })
8987     );
8988
8989     
// attach callbacks from options
8990     
return animation.progress( animation.opts.progress )
8991         .done( animation.opts.done, animation.opts.complete )
8992         .fail( animation.opts.fail )
8993         .always( animation.opts.always );
8994 }
8995
8996 function propFilter( props, specialEasing ) {
8997     
var index, name, easing, value, hooks;
8998
8999     
// camelCase, specialEasing and expand cssHook pass
9000     
for ( index in props ) {
9001         name = jQuery.camelCase( index );
9002         easing = specialEasing[ name ];
9003         
value = props[ index ];
9004         
if ( jQuery.isArray( value ) ) {
9005             easing =
value[ 1 ];
9006             
value = props[ index ] = value[ 0 ];
9007         }
9008
9009         
if ( index !== name ) {
9010             props[ name ] =
value;
9011             delete props[ index ];
9012         }
9013
9014         hooks = jQuery.cssHooks[ name ];
9015         
if ( hooks && "expand" in hooks ) {
9016             
value = hooks.expand( value );
9017             delete props[ name ];
9018
9019             
// not quite $.extend, this wont overwrite keys already present.
9020             
// also - reusing 'index' from above because we have the correct "name"
9021             
for ( index in value ) {
9022                 
if ( !( index in props ) ) {
9023                     props[ index ] =
value[ index ];
9024                     specialEasing[ index ] = easing;
9025                 }
9026             }
9027         }
else {
9028             specialEasing[ name ] = easing;
9029         }
9030     }
9031 }
9032
9033 jQuery.Animation = jQuery.extend( Animation, {
9034
9035     tweener: function( props, callback ) {
9036         
if ( jQuery.isFunction( props ) ) {
9037             callback = props;
9038             props = [
"*" ];
9039         }
else {
9040             props = props.split(
" ");
9041         }
9042
9043         
var prop,
9044             index =
0,
9045             length = props.length;
9046
9047         
for ( ; index < length ; index++ ) {
9048             prop = props[ index ];
9049             tweeners[ prop ] = tweeners[ prop ] || [];
9050             tweeners[ prop ].unshift( callback );
9051         }
9052     },
9053
9054     prefilter: function( callback, prepend ) {
9055         
if ( prepend ) {
9056             animationPrefilters.unshift( callback );
9057         }
else {
9058             animationPrefilters.push( callback );
9059         }
9060     }
9061 });
9062
9063 function defaultPrefilter( elem, props, opts ) {
9064     
/* jshint validthis: true */
9065     
var prop, value, toggle, tween, hooks, oldfire,
9066         anim =
this,
9067         orig = {},
9068         style = elem.style,
9069         hidden = elem.nodeType && isHidden( elem ),
9070         dataShow = jQuery._data( elem,
"fxshow" );
9071
9072     
// handle queue: false promises
9073     
if ( !opts.queue ) {
9074         hooks = jQuery._queueHooks( elem,
"fx" );
9075         
if ( hooks.unqueued == null ) {
9076             hooks.unqueued =
0;
9077             oldfire = hooks.empty.fire;
9078             hooks.empty.fire = function() {
9079                 
if ( !hooks.unqueued ) {
9080                     oldfire();
9081                 }
9082             };
9083         }
9084         hooks.unqueued++;
9085
9086         anim.always(function() {
9087             
// doing this makes sure that the complete handler will be called
9088             
// before this completes
9089             anim.always(function() {
9090                 hooks.unqueued--;
9091                 
if ( !jQuery.queue( elem, "fx" ).length ) {
9092                     hooks.empty.fire();
9093                 }
9094             });
9095         });
9096     }
9097
9098     
// height/width overflow pass
9099     
if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
9100         
// Make sure that nothing sneaks out
9101         
// Record all 3 overflow attributes because IE does not
9102         
// change the overflow attribute when overflowX and
9103         
// overflowY are set to the same value
9104         opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
9105
9106         
// Set display property to inline-block for height/width
9107         
// animations on inline elements that are having width/height animated
9108         
if ( jQuery.css( elem, "display" ) === "inline" &&
9109                 jQuery.css( elem,
"float" ) === "none" ) {
9110
9111             
// inline-level elements accept inline-block;
9112             
// block-level elements need to be inline with layout
9113             
if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
9114                 style.display =
"inline-block";
9115
9116             }
else {
9117                 style.zoom =
1;
9118             }
9119         }
9120     }
9121
9122     
if ( opts.overflow ) {
9123         style.overflow =
"hidden";
9124         
if ( !jQuery.support.shrinkWrapBlocks ) {
9125             anim.always(function() {
9126                 style.overflow = opts.overflow[
0 ];
9127                 style.overflowX = opts.overflow[
1 ];
9128                 style.overflowY = opts.overflow[
2 ];
9129             });
9130         }
9131     }
9132
9133
9134     
// show/hide pass
9135     
for ( prop in props ) {
9136         
value = props[ prop ];
9137         
if ( rfxtypes.exec( value ) ) {
9138             delete props[ prop ];
9139             toggle = toggle ||
value === "toggle";
9140             
if ( value === ( hidden ? "hide" : "show" ) ) {
9141                 
continue;
9142             }
9143             orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
9144         }
9145     }
9146
9147     
if ( !jQuery.isEmptyObject( orig ) ) {
9148         
if ( dataShow ) {
9149             
if ( "hidden" in dataShow ) {
9150                 hidden = dataShow.hidden;
9151             }
9152         }
else {
9153             dataShow = jQuery._data( elem,
"fxshow", {} );
9154         }
9155
9156         
// store state if its toggle - enables .stop().toggle() to "reverse"
9157         
if ( toggle ) {
9158             dataShow.hidden = !hidden;
9159         }
9160         
if ( hidden ) {
9161             jQuery( elem ).show();
9162         }
else {
9163             anim.done(function() {
9164                 jQuery( elem ).hide();
9165             });
9166         }
9167         anim.done(function() {
9168             
var prop;
9169             jQuery._removeData( elem,
"fxshow" );
9170             
for ( prop in orig ) {
9171                 jQuery.style( elem, prop, orig[ prop ] );
9172             }
9173         });
9174         
for ( prop in orig ) {
9175             tween = createTween( hidden ? dataShow[ prop ] :
0, prop, anim );
9176
9177             
if ( !( prop in dataShow ) ) {
9178                 dataShow[ prop ] = tween.start;
9179                 
if ( hidden ) {
9180                     tween.end = tween.start;
9181                     tween.start = prop ===
"width" || prop === "height" ? 1 : 0;
9182                 }
9183             }
9184         }
9185     }
9186 }
9187
9188 function Tween( elem, options, prop, end, easing ) {
9189     
return new Tween.prototype.init( elem, options, prop, end, easing );
9190 }
9191 jQuery.Tween = Tween;
9192
9193 Tween.prototype = {
9194     constructor: Tween,
9195     init: function( elem, options, prop, end, easing, unit ) {
9196         
this.elem = elem;
9197         
this.prop = prop;
9198         
this.easing = easing || "swing";
9199         
this.options = options;
9200         
this.start = this.now = this.cur();
9201         
this.end = end;
9202         
this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
9203     },
9204     cur: function() {
9205         
var hooks = Tween.propHooks[ this.prop ];
9206
9207         
return hooks && hooks.get ?
9208             hooks.
get( this ) :
9209             Tween.propHooks._default.
get( this );
9210     },
9211     run: function( percent ) {
9212         
var eased,
9213             hooks = Tween.propHooks[
this.prop ];
9214
9215         
if ( this.options.duration ) {
9216             
this.pos = eased = jQuery.easing[ this.easing ](
9217                 percent,
this.options.duration * percent, 0, 1, this.options.duration
9218             );
9219         }
else {
9220             
this.pos = eased = percent;
9221         }
9222         
this.now = ( this.end - this.start ) * eased + this.start;
9223
9224         
if ( this.options.step ) {
9225             
this.options.step.call( this.elem, this.now, this );
9226         }
9227
9228         
if ( hooks && hooks.set ) {
9229             hooks.
set( this );
9230         }
else {
9231             Tween.propHooks._default.
set( this );
9232         }
9233         
return this;
9234     }
9235 };
9236
9237 Tween.prototype.init.prototype = Tween.prototype;
9238
9239 Tween.propHooks = {
9240     _default: {
9241         
get: function( tween ) {
9242             
var result;
9243
9244             
if ( tween.elem[ tween.prop ] != null &&
9245                 (!tween.elem.style || tween.elem.style[ tween.prop ] ==
null) ) {
9246                 
return tween.elem[ tween.prop ];
9247             }
9248
9249             
// passing an empty string as a 3rd parameter to .css will automatically
9250             
// attempt a parseFloat and fallback to a string if the parse fails
9251             
// so, simple values such as "10px" are parsed to Float.
9252             
// complex values such as "rotate(1rad)" are returned as is.
9253             result = jQuery.css( tween.elem, tween.prop,
"" );
9254             
// Empty strings, null, undefined and "auto" are converted to 0.
9255             
return !result || result === "auto" ? 0 : result;
9256         },
9257         
set: function( tween ) {
9258             
// use step hook for back compat - use cssHook if its there - use .style if its
9259             
// available and use plain properties where available
9260             
if ( jQuery.fx.step[ tween.prop ] ) {
9261                 jQuery.fx.step[ tween.prop ]( tween );
9262             }
else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
9263                 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
9264             }
else {
9265                 tween.elem[ tween.prop ] = tween.now;
9266             }
9267         }
9268     }
9269 };

9270
9271 // Support: IE <=
9
9272 // Panic based approach to setting things
on disconnected nodes
9273
9274 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
9275     
set: function( tween ) {
9276         
if ( tween.elem.nodeType && tween.elem.parentNode ) {
9277             tween.elem[ tween.prop ] = tween.now;
9278         }
9279     }
9280 };
9281
9282 jQuery.each([
"toggle", "show", "hide" ], function( i, name ) {
9283     
var cssFn = jQuery.fn[ name ];
9284     jQuery.fn[ name ] = function( speed, easing, callback ) {
9285         
return speed == null || typeof speed === "boolean" ?
9286             cssFn.apply(
this, arguments ) :
9287             
this.animate( genFx( name, true ), speed, easing, callback );
9288     };
9289 });
9290
9291 jQuery.fn.extend({
9292     fadeTo: function( speed, to, easing, callback ) {
9293
9294         
// show any hidden elements after setting opacity to 0
9295         
return this.filter( isHidden ).css( "opacity", 0 ).show()
9296
9297             
// animate to the value specified
9298             .end().animate({ opacity: to }, speed, easing, callback );
9299     },
9300     animate: function( prop, speed, easing, callback ) {
9301         
var empty = jQuery.isEmptyObject( prop ),
9302             optall = jQuery.speed( speed, easing, callback ),
9303             doAnimation = function() {
9304                 
// Operate on a copy of prop so per-property easing won't be lost
9305                 
var anim = Animation( this, jQuery.extend( {}, prop ), optall );
9306
9307                 
// Empty animations, or finishing resolves immediately
9308                 
if ( empty || jQuery._data( this, "finish" ) ) {
9309                     anim.stop(
true );
9310                 }
9311             };
9312             doAnimation.finish = doAnimation;
9313
9314         
return empty || optall.queue === false ?
9315             
this.each( doAnimation ) :
9316             
this.queue( optall.queue, doAnimation );
9317     },
9318     stop: function( type, clearQueue, gotoEnd ) {
9319         
var stopQueue = function( hooks ) {
9320             
var stop = hooks.stop;
9321             delete hooks.stop;
9322             stop( gotoEnd );
9323         };
9324
9325         
if ( typeof type !== "string" ) {
9326             gotoEnd = clearQueue;
9327             clearQueue = type;
9328             type = undefined;
9329         }
9330         
if ( clearQueue && type !== false ) {
9331             
this.queue( type || "fx", [] );
9332         }
9333
9334         
return this.each(function() {
9335             
var dequeue = true,
9336                 index = type !=
null && type + "queueHooks",
9337                 timers = jQuery.timers,
9338                 data = jQuery._data(
this );
9339
9340             
if ( index ) {
9341                 
if ( data[ index ] && data[ index ].stop ) {
9342                     stopQueue( data[ index ] );
9343                 }
9344             }
else {
9345                 
for ( index in data ) {
9346                     
if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
9347                         stopQueue( data[ index ] );
9348                     }
9349                 }
9350             }
9351
9352             
for ( index = timers.length; index--; ) {
9353                 
if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
9354                     timers[ index ].anim.stop( gotoEnd );
9355                     dequeue =
false;
9356                     timers.splice( index,
1 );
9357                 }
9358             }
9359
9360             
// start the next in the queue if the last step wasn't forced
9361             
// timers currently will call their complete callbacks, which will dequeue
9362             
// but only if they were gotoEnd
9363             
if ( dequeue || !gotoEnd ) {
9364                 jQuery.dequeue(
this, type );
9365             }
9366         });
9367     },
9368     finish: function( type ) {
9369         
if ( type !== false ) {
9370             type = type ||
"fx";
9371         }
9372         
return this.each(function() {
9373             
var index,
9374                 data = jQuery._data(
this ),
9375                 queue = data[ type +
"queue" ],
9376                 hooks = data[ type +
"queueHooks" ],
9377                 timers = jQuery.timers,
9378                 length = queue ? queue.length :
0;
9379
9380             
// enable finishing flag on private data
9381             data.finish =
true;
9382
9383             
// empty the queue first
9384             jQuery.queue(
this, type, [] );
9385
9386             
if ( hooks && hooks.stop ) {
9387                 hooks.stop.call(
this, true );
9388             }
9389
9390             
// look for any active animations, and finish them
9391             
for ( index = timers.length; index--; ) {
9392                 
if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
9393                     timers[ index ].anim.stop(
true );
9394                     timers.splice( index,
1 );
9395                 }
9396             }
9397
9398             
// look for any animations in the old queue and finish them
9399             
for ( index = 0; index < length; index++ ) {
9400                 
if ( queue[ index ] && queue[ index ].finish ) {
9401                     queue[ index ].finish.call(
this );
9402                 }
9403             }
9404
9405             
// turn off finishing flag
9406             delete data.finish;
9407         });
9408     }
9409 });

9410
9411 // Generate parameters to create a standard animation

9412 function genFx( type, includeWidth ) {
9413     
var which,
9414         attrs = { height: type },
9415         i =
0;
9416
9417     
// if we include width, step value is 1 to do all cssExpand values,
9418     
// if we don't include width, step value is 2 to skip over Left and Right
9419     includeWidth = includeWidth?
1 : 0;
9420     
for( ; i < 4 ; i += 2 - includeWidth ) {
9421         which = cssExpand[ i ];
9422         attrs[
"margin" + which ] = attrs[ "padding" + which ] = type;
9423     }
9424
9425     
if ( includeWidth ) {
9426         attrs.opacity = attrs.width = type;
9427     }
9428
9429     
return attrs;
9430 }

9431
9432 // Generate shortcuts
for custom animations
9433 jQuery.each({
9434     slideDown: genFx(
"show"),
9435     slideUp: genFx(
"hide"),
9436     slideToggle: genFx(
"toggle"),
9437     fadeIn: { opacity:
"show" },
9438     fadeOut: { opacity:
"hide" },
9439     fadeToggle: { opacity:
"toggle" }
9440 }, function( name, props ) {
9441     jQuery.fn[ name ] = function( speed, easing, callback ) {
9442         
return this.animate( props, speed, easing, callback );
9443     };
9444 });
9445
9446 jQuery.speed = function( speed, easing, fn ) {
9447     
var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
9448         complete: fn || !fn && easing ||
9449             jQuery.isFunction( speed ) && speed,
9450         duration: speed,
9451         easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
9452     };
9453
9454     opt.duration = jQuery.fx.off ?
0 : typeof opt.duration === "number" ? opt.duration :
9455         opt.duration
in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
9456
9457     
// normalize opt.queue - true/undefined/null -> "fx"
9458     
if ( opt.queue == null || opt.queue === true ) {
9459         opt.queue =
"fx";
9460     }
9461
9462     
// Queueing
9463     opt.old = opt.complete;
9464
9465     opt.complete = function() {
9466         
if ( jQuery.isFunction( opt.old ) ) {
9467             opt.old.call(
this );
9468         }
9469
9470         
if ( opt.queue ) {
9471             jQuery.dequeue(
this, opt.queue );
9472         }
9473     };
9474
9475     
return opt;
9476 };
9477
9478 jQuery.easing = {
9479     linear: function( p ) {
9480         
return p;
9481     },
9482     swing: function( p ) {
9483         
return 0.5 - Math.cos( p*Math.PI ) / 2;
9484     }
9485 };
9486
9487 jQuery.timers = [];
9488 jQuery.fx = Tween.prototype.init;
9489 jQuery.fx.tick = function() {
9490     
var timer,
9491         timers = jQuery.timers,
9492         i =
0;
9493
9494     fxNow = jQuery.now();
9495
9496     
for ( ; i < timers.length; i++ ) {
9497         timer = timers[ i ];
9498         
// Checks the timer has not already been removed
9499         
if ( !timer() && timers[ i ] === timer ) {
9500             timers.splice( i--,
1 );
9501         }
9502     }
9503
9504     
if ( !timers.length ) {
9505         jQuery.fx.stop();
9506     }
9507     fxNow = undefined;
9508 };
9509
9510 jQuery.fx.timer = function( timer ) {
9511     
if ( timer() && jQuery.timers.push( timer ) ) {
9512         jQuery.fx.start();
9513     }
9514 };
9515
9516 jQuery.fx.interval =
13;
9517
9518 jQuery.fx.start = function() {
9519     
if ( !timerId ) {
9520         timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
9521     }
9522 };
9523
9524 jQuery.fx.stop = function() {
9525     clearInterval( timerId );
9526     timerId =
null;
9527 };
9528
9529 jQuery.fx.speeds = {
9530     slow:
600,
9531     fast:
200,
9532     
// Default speed
9533     _default:
400
9534 };

9535
9536 // Back Compat <
1.8 extension point
9537 jQuery.fx.step = {};

9538
9539 if
( jQuery.expr && jQuery.expr.filters ) {
9540     jQuery.expr.filters.animated = function( elem ) {
9541         
return jQuery.grep(jQuery.timers, function( fn ) {
9542             
return elem === fn.elem;
9543         }).length;
9544     };
9545 }
9546 jQuery.fn.offset = function( options ) {
9547     
if ( arguments.length ) {
9548         
return options === undefined ?
9549             
this :
9550             
this.each(function( i ) {
9551                 jQuery.offset.setOffset(
this, options, i );
9552             });
9553     }
9554
9555     
var docElem, win,
9556         box = { top:
0, left: 0 },
9557         elem =
this[ 0 ],
9558         doc = elem && elem.ownerDocument;
9559
9560     
if ( !doc ) {
9561         
return;
9562     }
9563
9564     docElem = doc.documentElement;
9565
9566     
// Make sure it's not a disconnected DOM node
9567     
if ( !jQuery.contains( docElem, elem ) ) {
9568         
return box;
9569     }
9570
9571     
// If we don't have gBCR, just use 0,0 rather than error
9572     
// BlackBerry 5, iOS 3 (original iPhone)
9573     
if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
9574         box = elem.getBoundingClientRect();
9575     }
9576     win = getWindow( doc );
9577     
return {
9578         top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop ||
0 ),
9579         left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft ||
0 )
9580     };
9581 };
9582
9583 jQuery.offset = {
9584
9585     setOffset: function( elem, options, i ) {
9586         
var position = jQuery.css( elem, "position" );
9587
9588         
// set position first, in-case top/left are set even on static elem
9589         
if ( position === "static" ) {
9590             elem.style.position =
"relative";
9591         }
9592
9593         
var curElem = jQuery( elem ),
9594             curOffset = curElem.offset(),
9595             curCSSTop = jQuery.css( elem,
"top" ),
9596             curCSSLeft = jQuery.css( elem,
"left" ),
9597             calculatePosition = ( position ===
"absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9598             props = {}, curPosition = {}, curTop, curLeft;
9599
9600         
// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9601         
if ( calculatePosition ) {
9602             curPosition = curElem.position();
9603             curTop = curPosition.top;
9604             curLeft = curPosition.left;
9605         }
else {
9606             curTop = parseFloat( curCSSTop ) ||
0;
9607             curLeft = parseFloat( curCSSLeft ) ||
0;
9608         }
9609
9610         
if ( jQuery.isFunction( options ) ) {
9611             options = options.call( elem, i, curOffset );
9612         }
9613
9614         
if ( options.top != null ) {
9615             props.top = ( options.top - curOffset.top ) + curTop;
9616         }
9617         
if ( options.left != null ) {
9618             props.left = ( options.left - curOffset.left ) + curLeft;
9619         }
9620
9621         
if ( "using" in options ) {
9622             options.
using.call( elem, props );
9623         }
else {
9624             curElem.css( props );
9625         }
9626     }
9627 };
9628
9629
9630 jQuery.fn.extend({
9631
9632     position: function() {
9633         
if ( !this[ 0 ] ) {
9634             
return;
9635         }
9636
9637         
var offsetParent, offset,
9638             parentOffset = { top:
0, left: 0 },
9639             elem =
this[ 0 ];
9640
9641         
// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
9642         
if ( jQuery.css( elem, "position" ) === "fixed" ) {
9643             
// we assume that getBoundingClientRect is available when computed position is fixed
9644             offset = elem.getBoundingClientRect();
9645         }
else {
9646             
// Get *real* offsetParent
9647             offsetParent =
this.offsetParent();
9648
9649             
// Get correct offsets
9650             offset =
this.offset();
9651             
if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
9652                 parentOffset = offsetParent.offset();
9653             }
9654
9655             
// Add offsetParent borders
9656             parentOffset.top += jQuery.css( offsetParent[
0 ], "borderTopWidth", true );
9657             parentOffset.left += jQuery.css( offsetParent[
0 ], "borderLeftWidth", true );
9658         }
9659
9660         
// Subtract parent offsets and element margins
9661         
// note: when an element has margin: auto the offsetLeft and marginLeft
9662         
// are the same in Safari causing offset.left to incorrectly be 0
9663         
return {
9664             top: offset.top - parentOffset.top - jQuery.css( elem,
"marginTop", true ),
9665             left: offset.left - parentOffset.left - jQuery.css( elem,
"marginLeft", true)
9666         };
9667     },
9668
9669     offsetParent: function() {
9670         
return this.map(function() {
9671             
var offsetParent = this.offsetParent || docElem;
9672             
while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
9673                 offsetParent = offsetParent.offsetParent;
9674             }
9675             
return offsetParent || docElem;
9676         });
9677     }
9678 });

9679
9680
9681 // Create scrollLeft and scrollTop methods

9682 jQuery.each( {scrollLeft:
"pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
9683     
var top = /Y/.test( prop );
9684
9685     jQuery.fn[ method ] = function( val ) {
9686         
return jQuery.access( this, function( elem, method, val ) {
9687             
var win = getWindow( elem );
9688
9689             
if ( val === undefined ) {
9690                 
return win ? (prop in win) ? win[ prop ] :
9691                     win.document.documentElement[ method ] :
9692                     elem[ method ];
9693             }
9694
9695             
if ( win ) {
9696                 win.scrollTo(
9697                     !top ? val : jQuery( win ).scrollLeft(),
9698                     top ? val : jQuery( win ).scrollTop()
9699                 );
9700
9701             }
else {
9702                 elem[ method ] = val;
9703             }
9704         }, method, val, arguments.length,
null );
9705     };
9706 });
9707
9708 function getWindow( elem ) {
9709     
return jQuery.isWindow( elem ) ?
9710         elem :
9711         elem.nodeType ===
9 ?
9712             elem.defaultView || elem.parentWindow :
9713             
false;
9714 }

9715 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods

9716 jQuery.each( { Height:
"height", Width: "width" }, function( name, type ) {
9717     jQuery.each( { padding:
"inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
9718         
// margin is only for outerHeight, outerWidth
9719         jQuery.fn[ funcName ] = function( margin,
value ) {
9720             
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
9721                 extra = defaultExtra || ( margin ===
true || value === true ? "margin" : "border" );
9722
9723             
return jQuery.access( this, function( elem, type, value ) {
9724                 
var doc;
9725
9726                 
if ( jQuery.isWindow( elem ) ) {
9727                     
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
9728                     
// isn't a whole lot we can do. See pull request at this URL for discussion:
9729                     
// https://github.com/jquery/jquery/pull/764
9730                     
return elem.document.documentElement[ "client" + name ];
9731                 }
9732
9733                 
// Get document width or height
9734                 
if ( elem.nodeType === 9 ) {
9735                     doc = elem.documentElement;
9736
9737                     
// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
9738                     
// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
9739                     
return Math.max(
9740                         elem.body[
"scroll" + name ], doc[ "scroll" + name ],
9741                         elem.body[
"offset" + name ], doc[ "offset" + name ],
9742                         doc[
"client" + name ]
9743                     );
9744                 }
9745
9746                 
return value === undefined ?
9747                     
// Get width or height on the element, requesting but not forcing parseFloat
9748                     jQuery.css( elem, type, extra ) :
9749
9750                     
// Set width or height on the element
9751                     jQuery.style( elem, type,
value, extra );
9752             }, type, chainable ? margin : undefined, chainable,
null );
9753         };
9754     });
9755 });

9756 // Limit scope pollution
from any deprecated API
9757 // (function() {
9758
9759 // The number of elements contained
in the matched element set
9760 jQuery.fn.size = function() {
9761     
return this.length;
9762 };
9763
9764 jQuery.fn.andSelf = jQuery.fn.addBack;

9765
9766 // })();

9767 if
( typeof module === "object" && module && typeof module.exports === "object" ) {
9768     
// Expose jQuery as module.exports in loaders that implement the Node
9769     
// module pattern (including browserify). Do not create the global, since
9770     
// the user will be storing it themselves locally, and globals are frowned
9771     
// upon in the Node module world.
9772     module.exports = jQuery;
9773 }
else {
9774     
// Otherwise expose jQuery to the global object as usual
9775     window.jQuery = window.$ = jQuery;
9776
9777     
// Register as a named AMD module, since jQuery can be concatenated with other
9778     
// files that may use define, but not via a proper concatenation script that
9779     
// understands anonymous AMD modules. A named AMD is safest and most robust
9780     
// way to register. Lowercase jquery is used because AMD module names are
9781     
// derived from file names, and jQuery is normally delivered in a lowercase
9782     
// file name. Do this after creating the global so that if an AMD module wants
9783     
// to call noConflict to hide this version of jQuery, it will work.
9784     
if ( typeof define === "function" && define.amd ) {
9785         define(
"jquery", [], function () { return jQuery; } );
9786     }
9787 }
9788
9789 })( window );



Full source code website bán hàng thương mại điện tử gần giống shopee 469.175 lượt xem

Gõ tìm kiếm nhanh...